当前位置: 技术问答>linux和unix
APUE上的例子
来源: 互联网 发布时间:2016-06-23
本文导语: 今天看到信号那章,里面讲到:当程序捕捉到一个信号并进入信号处理函数时会设置此信号的阻塞位,并且用10-14例程演示,可是我在我的fedora上演示的结果是不会设置其阻塞位。我的内核是2.6.23,很奇怪啊,...
今天看到信号那章,里面讲到:当程序捕捉到一个信号并进入信号处理函数时会设置此信号的阻塞位,并且用10-14例程演示,可是我在我的fedora上演示的结果是不会设置其阻塞位。我的内核是2.6.23,很奇怪啊,书上似乎说任何平台都会设置的,可是我的机子上并未设置。我还特意写了个例子测试,仍然不会设置。
还有,就是例子10-16.该例子演示sigsuspend函数在控制全局变量的一个作用。main中有个循环,会测试一个全局变量,如果程序捕捉到SIGINT信号则显示捕捉到的信息但不设置全局变量,如果程序捕捉到SIGQUIT信号,则会设置全局变量,从而导致整个程序结束。我上机测试的结果是我连续输入两个ctrl+c也就是产生SIGINT信号就会导致程序结束,可是我并未产生SIGQUIT信号啊,非常奇怪啊。
还有,就是例子10-16.该例子演示sigsuspend函数在控制全局变量的一个作用。main中有个循环,会测试一个全局变量,如果程序捕捉到SIGINT信号则显示捕捉到的信息但不设置全局变量,如果程序捕捉到SIGQUIT信号,则会设置全局变量,从而导致整个程序结束。我上机测试的结果是我连续输入两个ctrl+c也就是产生SIGINT信号就会导致程序结束,可是我并未产生SIGQUIT信号啊,非常奇怪啊。
|
早期unix信号的问题
1. 信号可能会丢失:信号发生了进程却不知道
2. 信号控制力弱:比如有时用户希望通知内核阻塞信号(不要忽略该信号,而是在其发生时记住它,然后在进程作好了准备时再恢复之)这种阻塞信号的能力当时并不具备。
3. 信号被抓获的时候,信号处理程序会被重置为DFL。
4. 慢性系统调用被中断时,必须手工重启之。下面的代码便是个例子:
again:
if ( (n = read(fd, buff, BUFFSIZE))
1. 信号可能会丢失:信号发生了进程却不知道
2. 信号控制力弱:比如有时用户希望通知内核阻塞信号(不要忽略该信号,而是在其发生时记住它,然后在进程作好了准备时再恢复之)这种阻塞信号的能力当时并不具备。
3. 信号被抓获的时候,信号处理程序会被重置为DFL。
4. 慢性系统调用被中断时,必须手工重启之。下面的代码便是个例子:
again:
if ( (n = read(fd, buff, BUFFSIZE))