signal函数的缺点:
1.函数的原型
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
其中handler指定当信号signum发生时的行为,可取以下三个值:SIG_IGN,SIG_DEL,函数地址。
2.当一个信号发生时,根据handler取值的不同,相应的行为也不同:
* 如果handler为SIG_IGN,就忽略这个信号
* 如果handler为SIG_DEL,就采取默认动作
* 如果handler被指定为一个函数地址,首先可能会发生这两种情况之一:要么将此信号的行为被重置为SIG_DEL,要么阻塞这个信号
然后,才执行对应的信号处理函数,并且如果是阻塞这个信号的话,当从处理函数返回时,就解阻塞此信号。
注意: 在多线程中,signal的作用是未定的。(the effects of signal() in a multithreaded process are unspecified)
可移植性问题:
* 只有将信号的动作设置为SIG_DEL或SIG_IGN时,signal函数才是可移植的。
* 当信号发生时,到底是重置为SIG_DEL,还是阻塞此信号,在不同的系统上是不同的。因此要使用sigaction而不是signal。
1.函数的原型
typedef void(*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
其中handler指定当信号signum发生时的行为,可取以下三个值:SIG_IGN,SIG_DEL,函数地址。
2.当一个信号发生时,根据handler取值的不同,相应的行为也不同:
* 如果handler为SIG_IGN,就忽略这个信号
* 如果handler为SIG_DEL,就采取默认动作
* 如果handler被指定为一个函数地址,首先可能会发生这两种情况之一:要么将此信号的行为被重置为SIG_DEL,要么阻塞这个信号
然后,才执行对应的信号处理函数,并且如果是阻塞这个信号的话,当从处理函数返回时,就解阻塞此信号。
注意: 在多线程中,signal的作用是未定的。(the effects of signal() in a multithreaded process are unspecified)
可移植性问题:
* 只有将信号的动作设置为SIG_DEL或SIG_IGN时,signal函数才是可移植的。
* 当信号发生时,到底是重置为SIG_DEL,还是阻塞此信号,在不同的系统上是不同的。因此要使用sigaction而不是signal。