待处理信号的处理方式

在unix的SIGINT信号由内核发送给用户进程,而此时正在执行有sigint触发的信号处理程序,那么此信号会被阻塞。

如果仅此而已,unix可以正确处理。但若此时又有一个sigint信号被投送到此用户进程,那么这个信号会被简单的丢弃,并不会排队。

 

在编写信号处理程序的时候通常容易忽略这点:

 

常见的错误是这样的:

 

 

会输出如下结果:

 

wuyichao@wuyichao-desktop:~/workspace/u_n_p/signal$ ./wait

Hello from child 22896

Hello from child 22897

Hello from child 22898

Handler reaped child 22896

.........

Handler reaped child 22897

.........

^C  

wuyichao@wuyichao-desktop:~/workspace/u_n_p/signal$ ./wait

Hello from child 22902

Hello from child 22903

Hello from child 22904

Handler reaped child 22902

.........

 

 

@通常的处理的方法,如<深入理解计算机系统>中代码p514

 

 

 

输出结果:

 

 

关键的地方:while ((pid = waitpid(-1, NULL, 0)) > 0)

    printf("Handler reaped child %d/n", (int)pid);

不让父进程几次进入信号处理程序。父进程就第一次进入信号程序,就陷在里面,直到while 结束

 

 

 

理解waitpid();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值