问题有关csapp书中,536叶的图8.28 signal1。
代码如下:
#include "csapp.h"
void handler1(int sig)
{
pid_t pid;
if( (pid = waitpid(-1, NULL, 0)) < 0 )
unix_error("waitpid error");
printf("Handler reaped child %d/n", (int)pid);
sleep(2);
return;
}
int main()
{
int i, n;
char buf[MAXBUF];
if( signal(SIGCHLD, handler1) == SIG_ERR)
unix_error("signal error");
for(i=0; i<3; i++) {
if(fork() == 0) {
printf("hello from child %d/n", (int)getpid());
sleep(1);
exit(0);
}
}
if( (n = read(STDIN_FILENO, buf, sizeof(buf))) < 0 )
unix_error("read");
printf("parent processing input /n");
while(1)
;
exit(0);
}
问题是我运行的时候,偶尔会出现只回收了一个子进程的情况,这个几率有的时候还很大。
而且,我的运行结果是:回收二个子进程时,被回收的是前两个,而不是书上的1,3个,by the way,我也不明白书上为什么是1,3个。还有8.29下面的运行结果中回收顺序是213。。。哪位大侠解释下,谢谢。
根据我的理解,只回收一个说明第一个SIGCHLD出现时,系统正在处理一个此类信号,或者第一个还没处理的时候,第二个就到了(甚至同时,不知道双核cpu会不会出现这种同时发出同一类信号的情况,对系统不熟悉,请大侠不吝赐教啊),结果因为有一个在pending,所以后面两个直接丢弃了。