1、自定义SIGNAL函数。可设置在执行信号处理函数过程中,是否能被其它信号或者与当前信号相同信号中断。
#define SIGNAL(s, handler)do { \
sa.sa_handler = handler; \
if (sigaction(s, &sa, NULL) < 0) \
printf("Couldn't establish signal handler (%d)", s); \
} while (0)
sa.sa_mask = g_sync_signals; //捕捉到某信号时,执行信号处理函数过程中,被屏蔽(阻塞)的信号集合设置为g_sync_signals
sa.sa_flags = 0;//默认不设置SA_NODEFER标志。即捕捉到某一信号时,执行信号处理函数过程中,会暂时阻塞该信号,信号处理结束后,只会触发一次该信号。
其它标志及用法请参考unix高级环境编程。
2、使用sigprocmask函数进行信号屏蔽
#include <signal.h>
int sigprocmask(int how, const sigset_t *restrict_set, sigset_t *restrict_oset)
how取值如下:
SIG_BLOCK//“或”操作。新的信号屏蔽字是,当前信号屏蔽字与set指向的信号屏蔽字的并集。
SIG_UNBLOCK//解除信号屏蔽。
SIG_SETMASK//赋值操作。新的信号屏蔽字是,set指向的信号屏蔽字。
关于oset
不为NULL时,可获取设置新的信号屏蔽字前的信号屏蔽字
举例:sigprocmask(SIG_BLOCK, &g_sync_signals, NULL); //屏蔽信号
sigprocmask(SIG_UNBLOCK, &g_sync_signals, NULL); //解除信号屏蔽
3、信号屏蔽过程中,向进程发送多个不同的信号多次。那么,在解除屏蔽后,每个信号只会触发一次。(每个信号只会被递送一次給当前进程)
4、SIGCHLD信号处理函数中,千万不能调用system()函数。