进程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是一个异步事件来警告子终止。 –