我試過使用下面的(Will wait and waitpid block SIGCHLD and unblock it when they return in Linux?)來回答我的問題。鏈接的解決方案讓我瞭解下面的內容。那麼爲什麼它錯了?在waitpid中處理SIG_CHLD
考慮以下幾點:
的處理器
void sig_child(int sig) { signal(SIGCHLD, sig_child); if (sig == SIGCHLD) { int status; pid_t num; while ((num = waitpid(WAIT_ANY, &status, WNOHANG)) > 0) { } if (num == -1 && errno != ECHILD) { // We shouldn't reach here assert(0); } }
主要導語:
if (pidnum)
{ //Some work
int status;
pid_t num = waitpid(pidnum, &status, 0);
// Some work
}
我認爲,以下應該發生:
1)主代碼(在第二導語)調用waitpid函數
2)SIG_CHLD升高,從而控制轉移到信號處理程序
3)信號處理程序從信號處理程序中刪除終止的子程序,獲取其狀態信息
4)當控制轉回到主代碼(第二Blurb的),因爲該進程的孩子已經從進程表中刪除,NUM應設置爲-1
其實中,發生如下(我使用的是現在去除追查流量一些打印語句),上述矛盾我的理解:
1)主要的Blurb達到waitpid函數
2)SIG_CHLD升高,從而控制轉移給處理者
3)NUM被設置爲-1,並將errno到ECHILD
4),控制返回到主書籍說明,其中num給出 子已被前叉形的PID。
你能解釋一下你最終要達到什麼目的?你爲什麼要調用'waitpid'兩次? –
我想編程一個迷你shell,我可以設置後臺進程和前臺進程。我在主界面中調用了waitpid,沒有WNOHANG,因爲我希望我的shell等到其子進程結束。還有另一部分主界面(未顯示),其中我產生了後臺進程。這些由信號處理程序處理。我通過與WNOHANG等待來處理這些後臺進程,這樣如果多個後臺進程在同一時間終止,我可以收穫所有後臺進程。 – Muno