2017-03-12 57 views
1

嗨的狀態是有點新的C programming.I有以下一段代碼,基本程序需要檢查子進程的狀態和家長等到孩子終止,然後打印「孩子已終止「。但是我嘗試了WNOHANG,但不知何故,我的第二次檢查沒有成功,或者我無法阻止子進程。任何想法的傢伙?提前致謝。檢查子進程

代碼:

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main() 
{ 
    int pid; 
    int ppid; 
    int status; 
    pid=vfork(); 
    pid_t return_pid = waitpid(pid, &status, WNOHANG); 

    if (pid<0) { 
     printf("\n Error "); 
     exit(1); 
    } else if (pid==0) { 
     printf("\n Hello I am the child process "); 
     printf("\n My pid is %d %d ",return_pid, getpid()); 
     exit(0); 
    } else if (return_pid == pid) { 
      printf("child is finished %d %d", return_pid, pid); 
      exit(0); 
    } else { 
     printf("\n Hello I am the parent process %d %d", return_pid, pid); 
     printf("\n My actual pid is %d %d \n ",return_pid, getpid()); 
     exit(1); 
    } 
} 
+0

作爲一個側面說明,從'的vfork()'手冊頁:「_The孩子不能從當前函數返回或者調用exit(3),但可以調用_exit(2)._」你不準'退出「在孩子的第三行。 – DyZ

+1

並且對'vfork的其他限制()'太 - 調用'waitpid函數()'是無效的。在我的書中,'vfork()'限制性太強,無法使用;我從不使用它。 –

+0

我想你應該在這裏使用fork而不是vfork。使用vfork,父進程被暫停,直到孩子完成,所以你的父母真的沒有什麼需要檢查的地方,這裏沒有任何並行性。用叉子,父母和孩子都可以並行運行,所以父母的檢查是有趣且有用的。這聽起來像是任務的重點:嘗試並行。 – ScottK

回答

2

我不知道,也許你的waitpid函數是在錯誤的位置。檢查man 2 wait並讀取pid的參數代表

pid參數指定要等待的子進程集。如果pid爲-1,則調用將等待任何子進程。 如果pid爲0,呼叫等待來電的過程組中的任何孩子 過程。如果pid大於零,則調用將等待進程ID爲pid的進程。如果pid小於-1,呼叫等待任何 過程,其進程組ID等於PID絕對值。

對我來說,大膽的文字表示孩子可能正在等待自己? vfork的值將爲孩子返回0。

此外,WNOHANG選項將導致waitpid函數,如果孩子沒有離開立即返回,這意味着父進程將不會等待孩子完成。如果子進程已完成,則它將返回孩子的PID。