進程1絕對不能退出; Unix的許多(全部?)實現會強制系統崩潰。 (我假設內核在將控制權轉移到用戶空間之前在控制檯上打開fds 0,1和2,請檢查您的內核的文檔以瞭解更多信息,請訪問:http://www.microsoft.com/technet/downloads/details.aspx?displaylang=zh-cn&FamilyID=1&fmd=0&displaylang=zh-cn&displaylang=zh-cn&displaylang=zh-cn&displaylang=zh-cn&displaylang=zh-cn這一點,引導環境的其他細節,如果你確實會寫自己init
):
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t child = fork();
if (child == -1) {
perror("init: fork");
return 1;
}
if (child == 0) {
execl("/etc/rc", "/etc/rc", (char*)0);
perror("/etc/rc");
return 1;
}
for (;;)
wait(0);
}
開始/etc/rc
它確實進入一個無限循環,一遍又一遍的呼喚wait
,並扔掉後結果。但wait
是阻止系統調用的。每次調用它時,內核都會使CPU遠離進程1,並將其交給進行有用工作的進程; wait
只有在有退出的孩子要報告時纔會返回。 (如果存在沒有進程有用的工作要做,則CPU將進入低功率「休眠」狀態,直到某些外部事件(例如,鍵盤或網絡數據包到達上一個人打字,給出了一個正在運行的進程有些工作要做。)
有了這個最小init
,這完全是/etc/rc
的責任,啓動了所有使計算機所需的程序做一些有用的事情,並且這些項目的責任只要需要就繼續運行;如果事實證明,除此之外的每一個進程都會退出,它將永遠只在wait
中休眠。更復雜的實現將會做得更多,例如重新啓動網絡服務器,如果他們崩潰
所以我正確的想''等待'系統調用只恢復父進程一旦孩子終止,'SIGCHILD'信號是不同的'等待'機制? – BenJacob
'wait'用於:獲取已終止子進程的退出狀態,並從進程列表中刪除子進程(無殭屍)。 「等待」不會恢復任何事情。 'wait'可以同步等待子終止,SIGCHILD是一個異步事件來警告子終止。 –