@Ubuntu:~/apuestudy/10/3$ ./sig3
sleeping 0
sleeping 1
^Ci got signal 2
i= 0
i= 1
^C
这里先ctrl+c进入信号处理函数,然后ctrl+c终止程序,应为有sa_resethan是在信号处理函数中ctrl+c变为默认,这样就终止
sleeping 0
sleeping 1
^\退出
这个简单,就没进信号处理函数,
sleeping 0
^Ci got signal 2
i= 0
i= 1
^\i= 2
^\i= 3
i= 4
退出
这个进入信号处理函数,键入ctrl+\,由于 sigaddset (&act.sa_mask, SIGQUIT)键所以对ctrl+\屏蔽,但回到主进程中依然会处理该信号,故退出,
好啦:现在把sa_flags改为sa_nodefer
i got signal 2
i= 0
i= 1
i= 2
i= 3
^Ci got signal 2
i= 0
i= 1
^Ci got signal 2
i= 0
i= 1
^\i= 2
i= 3
i= 4
i= 2
i= 3
i= 4
i= 4
退出
呵呵,sigaddset (&act.sa_mask, SIGQUIT);信号处理函数函数依然屏蔽,到主函数停止,
但是可以在信号处理函数中多次ctrl+c而不会推出,因为没有 SA_RESETHAND 所以不会恢复默认处理,还有个有趣的现象是i的输出顺序,这个没有信号队列的处理机制,小弟水平有限。
再看看只有 SA_RESETHAND
sleeping 0
^Ci got signal 2
i= 0
i= 1
^Ci= 2
i= 3
^\i= 4
这里有可能有人问, SA_RESETHAND 恢复默认,为什么没有停止,应为没有设置sa_nodefer
所以处理函数是对ctrl+c是阻塞的,只有到主函数中才有作用,
还有一个结果
sleeping 0
^Ci got signal 2
i= 0
i= 1
^\i= 2
^Ci= 3
i= 4
这个和上面的一样,但是在信号处理函数中,我把ctrl+c与ctrl+\的执行顺序便啦,如果ctrl+\作用,则在最后有“退出”两个子,可是这两个顺序都没有,可见不管是那个执行,都是ctrl+c作用结束啦程序,这个可能与信号与信号优先级有关??水平有限,待高手
小弟刚自学linux编程,以上只是根据试验结果自己理解,如有错误,恳请指教,
Q:915311043
今天又看程序发现以前有不完全的理解:
如果我们只用SA—NODEFER,这样会发现只要ctrl+c键入一次,就会运行一次handler(信号处理函数);
而你对信号作用的设置,只是对信号处理函数有作用,在主函数中ctrl+\仍然会终止程序,但是为什么键入ctrl+c不会终止,应为sigaction函数捕捉的是sigint(ctrl+c产生的信号),所以会再次产生handler