2012-08-31 81 views
0

我非常瞭解C編程,但我對Unix系統調用沒有太多經驗。很長一段時間後,我正在重新探索我的Unix知識。所以我開始使用fork和execlp系統調用。我在ubuntu_linux上練習例子。程序無法執行語句

這是一個教科書示例程序,它接受來自STD_IN的命令並在子進程中執行它。

int main (int argc, char *argv[]) { 
    char command[MAX_LINE]; 
    pid_t pid; 
    int status; 

    printf ("%% "); 
    while (fgets (command,MAX_LINE,stdin) != NULL){ 
     if (command[strlen(command)-1] == '\n') 
      command[strlen(command)-1] = '\0'; 

     if ((pid=fork()) < 0) { 
      perror ("fork failed : \n"); 
     } 

     if (pid == 0) { 
      printf (" I am child and my PID is %d",getpid()); 
      execlp (command, command, (char *)0); 
      perror ("couldn't execute:"); 
      exit(127); 
     } 

     printf (" I am parent and my PID is %d\n ",getpid()); 
     if ((pid = waitpid (pid, &status, 0)) < 0){ 
      perror("waitpid error\n"); 
     } 

     printf ("%% "); 
    } 
    exit (0); 
} 

我把一些printf statments但節目沒有打印行「我的孩子和我的PID爲」每當命令執行成功。但是,如果輸入命令不正確並且失敗,它將打印上面的行。

由於打印語句在execlp之前,我期待在這兩種情況下打印該行。

+1

您可能希望在execlp之前刷新printf,即fflush(stdout)並查看所得結果。 –

+0

爲什麼你總是打印錯誤並迫使你的孩子退出失敗? – Anycorn

+0

@ApprenticeQueue:我知道fflush會解決它的問題。但程序正在顯示printf之後的perror的輸出。在這裏,stdout和stderr都只指向控制檯。 – Sach

回答

0

這應該在exec之前刷新stdout。

printf (" I am child and my PID is %d",getpid()); 
fflush(stdout); 
execlp (command, command, (char *)0);