【求助】csapp书中关于信号处理的一个问题

在《csapp》一书的8.28页,涉及到signal1的信号处理问题,作者在代码中遇到实际运行时偶尔只能回收一个子进程的情况。此问题可能由于信号处理的并发性和调度导致,比如当第一个SIGCHLD信号还在处理时,第二个或更多信号到达,可能会导致其他信号被丢弃。书中的回收顺序1,3和213等与实际运行结果不同,需要深入理解信号处理机制和系统行为。
摘要由CSDN通过智能技术生成

问题有关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,所以后面两个直接丢弃了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值