2011-03-12 55 views
0

使用fork系統調用時,我看到很多次父進程調用waitpid以便子進程完成。通知父進程

我在這裏的問題是孩子發送通知給父母preocess。如果不使用任何共享資源,父母如何識別chil已完成?

回答

4

當孩子退出時,操作系統向父母發送SIGCHLD。您可以選擇使用WNOHANG輪詢waitpid(),或者在收到SIGCHLD後僅與wait()進行覈對。子進程不需要特別做任何事情,這一切都由操作系統管理。

1

在Linux操作系統中,每個孩子都有一些父母,即使父母在孩子之前死亡,該孩子也被init(PID:1)進程繼承。這樣做是爲了不應該有任何殭屍進程(進程表中存在進程表,但進程實際上已經死亡),這會佔用無用的內存空間。

內核會關注所有因完全執行或由於其他原因(如無效內存訪問)而死亡的進程,並保留一些信息,如孩子的退出狀態。當孩子終止SIGCHLD信號發送給父母。默認情況下,信號被忽略。但是,通常在SIGCHLD的處理程序中實現系統調用,以便父級可以根據子級的退出狀態進行操作。

0

除了通過SIGCHLD作爲mentioned作者Erik之外,您還可以使用WNOHANG來輪詢孩子感興趣的事件。這裏有一個例子:

pid_t pid = fork(); 
if (pid) { 
    while (1) { 
     int status; 
     int waitpid(pid, &status, WNOHANG); 
     if (pid == waitpid && WIFEXITED(status)) 
      break;    
     // do other stuff 
    } 
}