signal 杂谈

来源:互联网 发布:2017最新网络情歌 编辑:程序博客网 时间:2024/06/02 01:17

信号sigsuspend终于搞懂了。道路是曲折的。

如有无信号处理函数。zeromask和waitmask区别。两者对pause和sigsuspend的不同.
对信号是不是pending。非mask的信号处理。
testcase的情况很多。易混淆.


pause和sigsuspend:

comments: sigpromask 的mask 和sigsuspend的pendmask 没有关系。这是两个不同的mask。互相不影响。

sigprocmask是为pause用的,如设置mask为block ,SIGQUIT。则pause将ignore SIGQUIT。

对sigsuspend没有任何影响。 

对于sigsuspend 根据自己的pendmask在决定做什么。

如果其不是empty,mask是SIGQUIT,则block SIGQUIT。

如果是empty,则接收任何信号。在pendmask会保存这个信号。


signal函数是非block的,在后台。类似捕获中断,捕获信号。然后用函数处理信号。是接收信号,

与发送信号没关系。

alarm,kill 等才是发送信号。

wait是等待进程结束,和信号没关系


sigsuspend 和sigprocmask 使用上没有任何关系。但是它们是固定搭配。

在sigsuspend之前,先save current signal mask。在sigsuspend之后,restore signal mask。

//保存当前信号屏蔽字

if (sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0)
if (sigsuspend(&waitmask))

// 恢复原来的信号屏蔽字

if(sigprocmask(SIG_SETMASK,&oldmask,NULL))

sigpromask(0,NULL,&sigset) 这句很主要。这句是get current signal。不是清空.


信号还有一些其他函数:sigemptyset, sigaddset, sigismember

signal和sigset 一样。sigaction是signal的升级版


abort函数
abort()是使异常程序终止,同时发送SIGABRT信号给调用进程。


0 0
原创粉丝点击