UNIX平台信号(SIGNAL)处理

1. 设置信号响应动作的相关系统函数

void (*signal ( int signo,(void)(*func)() ) ()
void (*sigset( int signo,(void)(*func)() ) ()
int sigaction( int signo,struct sigaction *action,struct sigaction *oldaction )

上述3个系统函数均完成某信号的响应动作设定。而且该设定的作用域是进程级的,即对进程中所有线程都起作用。

(1) signal() 与sigset() 的同异
在有些版本的UNIX系统中,signal() 会在调用信号处理函数前,重设该信号的动作为系统缺省动作。如果应用程序希望在响应信号后仍然按照自己的动作处理该信号,则必须在信号处理函数的第一行中使用signal()重设该动作。
Sigset()解决了signal()存在的上述问题。其余功能和特性与signal()相同。


(2) sigset()与sigaction()的同异
Sigaction 不能与sigwait()同时使用。在设定某信号的新的响应动作时,原有动作保存在参数oldaction中,sigset() 和signal()则通过函数结果值返回。

2. 信号阻塞相关系统函数
(1) 设置信号集的系统函数
sigemptyset( sigset_t *sigmask )
sigaddset( sigset_t *sigmask,int signo )
sigdelset( sigset_t *sigmask,int signo )

(2) 设置信号阻塞的系统函数
sighold( int signo )
sigrelse( int signo )
sigprocmask( int how, sigset_t *newsigmask,sigset_t *oldsigmask )
pthread_sigmask( int how,sigset_t *newsigmask,sigset_t *oldsigmask )
参数how :
SIG_BLOCK 设定信号集的信号阻塞
SIG_UNBLOCK 设定信号集的信号不阻塞
SET_SIGMASK 设定进程/线程信号掩码

sigprocmask() 与 pthread_sigmask()的同异
同:参数、功能相同。
异:Sigprocmask()作用域为进程级,pthread_sigmask()为线程级。

3. 信号发送系统函数
kill( int pid,int signo )
pthread_kill( pthread_t tid,int signo )

kill()作用域为进程级,pthread_kill()作用域为线程级。

4. 信号挂起系统函数
sigpause( int signo )
sigsuspend( sigset_t *sigset )
sigwait ( sigset_t *sigset, int *signo )

挂起函数 等待信号类型和数量 函数是否被阻塞信号中断 调用时是否改变信号掩码 返回时是否恢复原信号掩码
Pause() 所有非阻塞信号 不被中断 不改变 不恢复
Sigpause( ) 指定的某个阻塞/非阻塞信号 被中断 不改变 不恢复
Sigsuspend() 指定的一个或多个非阻塞信号 不被中断 改变 恢复
Sigwait () 指定的一个或多个阻塞/非阻塞信号 被中断 不改变 不恢复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值