信号通常使用一个无符号长整数(32位)中的比特位表示各种不同的信号。因此最多可以表示32个不同的信号。signal()和sigaction()的功能比较类似,都是更改信号原处理句柄(handler,或称为处理程序)。但signal()就是内核操作上述传统信号的方式,在某些特殊时刻可能会造成信号丢失。
之前介绍过signal()
函数,signal()函数
的返回值是一个无返回值且具有一个整型参数的函数指针,是默认的处理方式。并且在新句柄被调用执行过一次后,信号处理句柄又会被恢复成默认处理句柄值SIG_DFL。
在linux0.11源码中,include/signal.h
文件中,默认句柄SIG_DFL和忽略处理句柄SIG_IGN的定义是:
#define SIG_DFL ((void (*)(int))0)
#define SIG_IGN ((void (*)(int))1)
signal()函数不可靠的原因在于当信号已经发生而进入自己设置的信号处理函数中,但在重新再一次设置自己的处理句柄之前,在这段时间内有可能又有同样的信号发生了。但是此时系统已经把处理句柄设置成默认值。因为就有可能造成信号丢失。
为了防止信号的丢失,sigaction()
函数是比signal()
函数更安全的选择。如果坚持要用signal()
,可以在自己的信号处理函数开头再重新调用signal()
函数做相同的处理。
而sigaction()
函数比signal()
函数更可靠的原因是,在信号处理函数正在处理时,被捕捉的信号在处理期间会被自动屏蔽