2011-11-08 85 views
0

我正在嘗試編寫一個程序,其中程序通過while循環持續接收用戶輸入,並在每個循環中運行shell腳本時分流當前程序進程的新子。這是我目前有:Waitpid用法和Bash腳本

int main(int argc, char **argv) 
{ 
    while(!feof(stdin)){ 
     printf("Port Number:"); 
     fgets(portno, 100, stdin); 
     input[strlen(portno) - 1] = '\0'; 
     pid_t pid = fork(); 

     if (pid < 0){ 
      die("fork did not work"); 
     } else if (pid == 0){ 
      fprintf(stderr, "[pid=%d] ", (int)getpid()); 
      fprintf(stderr, "process started on port %s\n", portno); 
      execl("./netcattest.sh", "netcattest.sh", portno, (char *)0); 
      die("program failed"); 
     } else { 
      /* 
      if (waitpid(.... NEED HELP ON THIS PART 
      */ 
      fprintf(stderr, "[pid=%d] ", (int)pid); 
      fprintf(stderr, "program terminated\n"); 
     } 
    } 

return 0; 
} 

我的問題是閱讀waitpid文檔,我略有不清楚如何使用該函數。我想要發生的事情是,當程序是父進程時,我希望能夠以某種方式識別當前已終止的所有進程。例如,如果我運行循環3次,並在第二個循環之後第一個進程終止,我想以某種方式能夠識別終止的進程的PID。

我知道它涉及到使用WNOHANG選項,但我真的很困惑它是如何工作的。

非常感謝你們。

編輯:另外,有沒有一種快速的方法來做一段代碼的4縮進,而不是單獨隔開每一行?

+1

是的,選擇代碼並點擊「{}」圖標。 –

+0

謝謝Michael! – KWJ2104

回答

0

我從未使用過此功能,但我的文檔的理解是,你應該做到以下幾點:

int status; 
pid_t pid = waitpid(-1, &status, WNOHANG); 

在這一點上,pid將是-1錯誤,0,如果沒有進程退出或以其他方式退出的進程的PID(任意選擇;等待所有進程,繼續調用它)。您可以使用手冊頁上指定的各種宏函數來檢查status,以確定過程如何結束以及它的退出代碼是什麼。

+0

有沒有什麼方法可以獲得它,以便我可以將所有已退出的進程與只能任意選擇的進程進行比較?感謝您的回答。 – KWJ2104

+0

我編輯了我的答案 - 只是繼續調用waitpid直到它返回0.由於waitpid只返回一個PID和狀態,如果它收穫了多個進程,信息將會丟失。 – Max