【Linux系统编程】signal与sigaction

#include        

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);
 

sighandler_t参数是一个无返回值,参数为int的函数指针。

signum参数代表多少号信号。 

man手册中的解释:

signal() 的行为因 UNIX 版本而异,并且还具有历史上不同版本的 Linux 各不相同。 避免其使用:改用 sigaction(2)。 请参阅下面的可移植性。

signal() 将信号符号的处置设置为处理程序,要么是SIG_IGN,要么是SIG_DFL,要么是程序员的地址-定义的函数(“信号处理程序”)。

如果信号符号被传递到进程,则其中一个发生以下情况:

* 如果配置设置为 SIG_IGN,则信号为忽视。

* 如果处置设置为 SIG_DFL,则默认操作与信号(见信号(7))相关的发生。

上面的SIG_IGN与SIG_DFL是一个宏,可以看下图【Linux系统编程】signal与sigaction_第1张图片

他们分别把0和1强转成函数指针了,所以说他们俩并不是真正的处理函数,而是系统定义的识别码,设置以后出现该信号就执行系统的处理方案。这也就应了图片中第一行的Fake signal functions. 

注意下面图片中被框起来那句描述, 

【Linux系统编程】signal与sigaction_第2张图片

SIGKILL和SIGSTOP信号的处理方式无法被设置为SIG_IGN,所以用户使用signal函数无法操作这两个信号 。

signal函数只能捕捉信号,并设置信号处理方式,但是不能获取信号的其他信息。

sigaction函数相当于加强版的signal函数,它利用了结构体放着信号处理函数以及其他信息,如下图【Linux系统编程】signal与sigaction_第3张图片

signum是信号,const struct sigaction *act用于设置当前进程信号的处理方式,struct sigaction *oldact是一个输入性参数,用于获取原先的sigaction参数信息。

可以看到sigaction结构体里面有五个成员,

1、2号成员都是信号处理方式,当sa_flags设置为0时使用sa_handler函数,设置为SA_SIGINFO时使用sa_sigaction函数。

sa_mask定义一组信号,在调用信号处理函数时将阻塞该组信号(不光阻塞当前信号),不允许它们中断此处理器程序的执行。(如何设置请看信号-信号集操作函数)

sigaction()的功能是为信号指定相关的处理函数,但是它在执行信号处理函数时,会把当前信号加入到进程的信号屏蔽字中,从而防止在进行信号处理期间信号丢失。详情请看信号-内核态与用户态


 

你可能感兴趣的:(Linux系统编程,算法,开发语言,linux)