linux信号屏蔽

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()函数。

system()函数中,会先屏蔽SIGCHLD信号。这是为了保证system()中启动的子进程退出时,system()函数中的waitpid能够回收子进程,从而不会触发SIGCHLD信号处理函数。然而,当system()函数结束前,解除信号屏蔽后,仍会触发一次SIGCHLD信号,并执行信号处理函数。这就会导致程序一直触发SIGCHLD信号,并无限循环,根本停不下来。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值