2012-11-10 36 views
1

我有一個任務,我必須創建一個能夠執行很多事情(包括作業控制)的迷你shell。我設法使用fork和execvp創建新的作業。但我也想獲得由execvp運行的程序的退出代碼。從我從其他職位擡頭看,我可以通過使用if(WIFEXITED(status))來做到這一點。c - 在後臺運行的程序的退出狀態

但是如果用戶在shell中輸入'&'進程名稱,我們還需要在後臺運行進程。所以當子程序在後臺完成時等待父進程等待是沒有意義的。是否有任何可以設置的中斷來通知父進程子進程已經結束?然後我可以使用if(WIFEXITED(status))語句來獲取退出代碼。

sleep 100 & 

將在後臺運行,同時,我可以在前臺同時執行其他外殼命令。

+2

有許多開放源代碼的shell實現,你看過它們中的任何一個嗎? FOSS不是關於價格,而是關於使用其他代碼。即使用於研究 –

回答

4

如果您沒有做任何特別的事情,父母在孩子死亡時會收到SIGCHLD。小心,但多個孩子可以同時終止,你會得到一個單一的信號。處理這個問題的正確方法是循環(在信號處理程序中):

while (waitpid(-1, NULL, WNOHANG) > 0) 
    /* Stuff. */ 
相關問題