使用execlp()遇到麻烦

我使用execlp来实现基于网络的命令,但它不工作。我正在使用

execlp("telnet 0 5000","telnet 0 5000",(char *)NULL); delwin(menubar); delwin(messagebar); endwin(); 

但它没有其他工作,如果我用ls替换telnet 0 5000它将工作,但输出来自相同的屏幕意味着在GUI和noecho得到自动激活和ls的输出以一种非常不寻常的方式。

下面是我的完整代码。

 #include  #include  #include #define ENTER 10 #define ESCAPE 27 void init_curses() { initscr(); start_color(); init_pair(1,COLOR_WHITE,COLOR_ BLUE); init_pair(2,COLOR_BLUE,COLOR_WHITE); init_pair(3,COLOR_RED,COLOR_WHITE); curs_set(0); //noecho(); keypad(stdscr,TRUE); } void draw_menubar(WINDOW *menubar) { wbkgd(menubar,COLOR_PAIR(2)); waddstr(menubar,"PARALLEL"); wattron(menubar,COLOR_PAIR(3)); waddstr(menubar,"CON."); wattroff(menubar,COLOR_PAIR(3)); wmove(menubar,0,20); waddstr(menubar,"SERIAL"); wattron(menubar,COLOR_PAIR(3)); waddstr(menubar,"CON."); wattroff(menubar,COLOR_PAIR(3)); } WINDOW **draw_menu(int start_col) { WINDOW **items; items=(WINDOW **)malloc(9*sizeof(WINDOW *)); items[0]=newwin(10,19,1,start_col); wbkgd(items[0],COLOR_PAIR(2)); box(items[0],ACS_VLINE,ACS_HLINE); items[1]=subwin(items[0],1,17,2,start_col+1); wprintw(items[1],"Shailendra singh",1); items[2]=subwin(items[0],1,17,3,start_col+1); wprintw(items[2],"THIVNENT TECH",2); items[3]=subwin(items[0],1,17,4,start_col+1); wprintw(items[3],"THINCLIENT",3); items[4]=subwin(items[0],1,17,5,start_col+1); wprintw(items[4],"SOLARCOMPUTING",4); items[5]=subwin(items[0],1,17,6,start_col+1); wprintw(items[5],"TECHNOCRATS",5); items[6]=subwin(items[0],1,17,7,start_col+1); wprintw(items[6],"SENSORS",6); items[7]=subwin(items[0],1,17,8,start_col+1); wprintw(items[7],"NCURSESLIB",7); items[8]=subwin(items[0],1,17,9,start_col+1); wprintw(items[8],"GCC COMPILER",8); wbkgd(items[1],COLOR_PAIR(1)); wrefresh(items[0]); return items; } void write_data0() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1; } if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1; } fputs("172.16.254.0 \n", fp); fputs("Server type = R ",ft); fclose(ft); fclose(fp); } void write_data1() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1; } if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1;} fputs("172.16.254.1 \n", fp); fputs("Server type = T ",ft); fclose(ft); fclose(fp); } void write_data2() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1;} if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1; } fputs("172.16.254.2 \n", fp); fputs("Server type = C ",ft); fclose(ft); fclose(fp); } void write_data3() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1; } if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1; } fputs("172.16.254.3 \n", fp); fputs("Server type = R ",ft); fclose(ft); fclose(fp); } void write_data4() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1;} if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1; } fputs("172.16.254.4 \n", fp); fputs("Server type = T ",ft); fclose(ft); fclose(fp); } void write_data5() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1; } if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1; } fputs("172.16.254.5 \n", fp); fputs("Server type = C ", ft); fclose(ft); fclose(fp); } void write_data6() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1;} if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1; } fputs("172.16.254.6 \n", fp); fputs("Server type = R ",ft); fclose(ft); fclose(fp); } void write_data7() {FILE *fp,*ft; fp = fopen("file.txt", "w"); ft = fopen("servertype.txt","w"); if(fp == NULL) {fprintf(stderr, "Cannot open \"file.txt\" for appending\n"); return 1; } if(ft == NULL) {fprintf(stderr, "Cannot open \"servertype.txt\" for appending\n"); return 1; } fputs("172.16.254.7 \n", fp); fputs("Server type = T ",ft); fclose(ft); fclose(fp); } WINDOW **draw_menu1(int start_col) { WINDOW **items; items=(WINDOW **)malloc(9*sizeof(WINDOW *)); items[9]=newwin(10,19,1,start_col); wbkgd(items[9],COLOR_PAIR(2)); box(items[9],ACS_VLINE,ACS_HLINE); items[1]=subwin(items[9],1,17,2,start_col+1); wprintw(items[1],"SHAILENDRA SINGH",1); items[2]=subwin(items[9],1,17,3,start_col+1); wprintw(items[2],"thivnent tech",2); items[3]=subwin(items[9],1,17,4,start_col+1); wprintw(items[3],"THINCLIENT",3); items[4]=subwin(items[9],1,17,5,start_col+1); wprintw(items[4],"SOLARCOMPUTING",4); items[5]=subwin(items[9],1,17,6,start_col+1); wprintw(items[5],"TECHNOCRATS",5); items[6]=subwin(items[9],1,17,7,start_col+1); wprintw(items[6],"SENSORS",6); items[7]=subwin(items[9],1,17,8,start_col+1); wprintw(items[7],"NCURSESLIB",7); items[8]=subwin(items[9],1,17,9,start_col+1); wprintw(items[8],"GCC COMPILER",8); wbkgd(items[1],COLOR_PAIR(1)); wrefresh(items[9]); return items; } void delete_menu(WINDOW **items,int count) { int i; for (i=0;i<count;i++) delwin(items[i]); free(items); } int scroll_menu(WINDOW **items,int count,int menu_start_col) { int key; int selected=0; while (1) { key=getch(); if (key==KEY_DOWN || key==KEY_UP) { wbkgd(items[selected+1],COLOR_PAIR(2)); wnoutrefresh(items[selected+1]); if (key==KEY_DOWN) { selected=(selected+1) % count; } else { selected=(selected+count-1) % count; } wbkgd(items[selected+1],COLOR_PAIR(1)); wnoutrefresh(items[selected+1]); doupdate(); } else if (key==KEY_LEFT || key==KEY_RIGHT) { delete_menu(items,count+1); touchwin(stdscr); refresh(); items=draw_menu(20-menu_start_col); return scroll_menu(items,8,20-menu_start_col); } else if (key==ESCAPE) { return -1; } else if (key==ENTER) { return selected; } } } int main() { int key; WINDOW *menubar,*messagebar; init_curses(); bkgd(COLOR_PAIR(1)); menubar=subwin(stdscr,1,80,0,0); messagebar=subwin(stdscr,1,79,23,1); draw_menubar(menubar); move(2,1); printw("Press F1 or F2 to open the menus. "); printw("ESC quits."); refresh(); do { int selected_item; WINDOW **menu_items; key=getch(); werase(messagebar); wrefresh(messagebar); if (key==KEY_F(1)) { menu_items=draw_menu(0); selected_item=scroll_menu(menu_items,8,0); delete_menu(menu_items,9); if (selected_item<0) wprintw(messagebar,"You haven't selected any item."); else if(selected_item==0){ wprintw(messagebar,"You have selected menu SHAILENDRA SINGH.",1); write_data0(); if(fork()) wait(0); else execlp("clear","clear",(char *)NULL); execlp("ls","ls",(char *)NULL); execlp("konsole","konsole",(char *)NULL); ESCAPE; refresh(); delwin(menubar); delwin(messagebar); endwin(); } else if(selected_item==1){ wprintw(messagebar,"You have selected menu THINVENT TECH.",2); write_data1(); } else if(selected_item==2){ wprintw(messagebar,"You have selected menu THINCLIENT.",3); write_data2(); } else if(selected_item==3){ wprintw(messagebar,"You have selected menu SOLAR COMPUTING",4); write_data3(); } else if(selected_item==4){ wprintw(messagebar,"You have selected menu TECHNOCRATS.",5); write_data4(); } else if(selected_item==5){ wprintw(messagebar,"You have selected menu SENSORS.",6); write_data5(); } else if(selected_item==6){ wprintw(messagebar,"You have selected menu NCURSESLIB.",7); write_data6(); } else if(selected_item==7){ wprintw(messagebar,"You have selected menu GCCCOMPILER.",8); write_data7(); } touchwin(stdscr); refresh(); } else if (key==KEY_F(2)) { menu_items=draw_menu1(20); selected_item=scroll_menu(menu_items,8,20); delete_menu(menu_items,9); if (selected_item<0) wprintw(messagebar,"You haven't selected any item."); else wprintw(messagebar, "You have selected menu item %d.",selected_item+1); touchwin(stdscr); refresh(); }} while (key!=ESCAPE); delwin(menubar); delwin(messagebar); endwin(); return 0; } 

你应该分别传递参数,第一个参数是要执行的文件的名称:

 execlp("/usr/bin/telnet", "telnet", "0", "5000", (char *)NULL); 

man execlp(3)

int execlp(const char * file,const char * arg,…);

这些函数的初始参数是要执行的文件的名称 。 execl(),execlp()和execle()函数中的const char * arg和后续省略号可以被认为是arg0,arg1,…,argn