2024年3月31日发(作者:)

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 () 指定的一个或多个阻塞/非阻塞信号 被中断 不改变 不恢复