2015-02-11 41 views
1

我遇到fork/waitpid函數的問題。父級和多個孩子PID。 fork&waitpid - 函數

我試圖讓程序什麼首先處理並打印PIDS兒童和家長後PID

我的代碼:

int main(void) 
{ 
    pid_t pid; 
    int rv = 0; 
    int i = 1; 
    pid_t child_pids[2]; 

    for (i = 0; i < 2; i++) 
    { 

     switch (pid = fork()) 
     { 
     case -1: 
      perror("fork"); 
      exit(1); 

     case 0: 
      pid = getpid(); 
      exit(i); 
      break; 

     default: 
      child_pids[i] = pid; 
      break; 
     } 
    } 
    if (pid != 0 && pid != -1) { 
     for (i = 0; i<2; i++){ 
      int status = 0; 
      printf("PARENT: waiting for child %d (%d)\n", i, child_pids[i]); 
      rv = waitpid(child_pids[i], &status, 0); 
      printf("Child: %d, Here!!!\n", i); 

     } 
     printf("parent pid = %d\n", getpid()); 

    } 
} 

目前它創建父第一和孩子之後。所以有人有什麼建議做什麼?

+0

什麼你的意思做「首先創建父」?父進程是正在運行的進程,它必須存在才能創建子進程。你能包括你的輸出嗎? – 2015-02-11 12:54:06

回答

1

waitpid(2)manpage

的PID值可以是:[...] -1意味着等待任何子進程。

waitpid函數():成功時返回其狀態已經改變子的進程ID; [...]

這意味着,你可以簡單地在waitpid函數循環在你的主,像這樣的結尾:

#define FORKED_CHILDREN 2 

if (pid != 0 && pid != -1) { 
    for (int collected = 0; collected < FORKED_CHILDREN; ++collected) { 
     pid_t cpid = waitpid(-1, NULL, 0); 
     printf("Child pid: %d\n", cpid); 
    } 
    printf("parent pid = %d\n", getpid()); 
}