linux 信号简介三 信号阻塞处理

原创 2011年01月19日 12:24:00

6. 信号的阻塞处理   
    1. 信号掩码——被阻塞的信号集
  每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,
  则传送到该进程的此种信号将会被阻塞。 当前被进程阻塞的信号集也叫信号掩码,类型为sigset_t。
  每个进程都有自己的信号掩码,且创建子进程时,子进程会继承父进程的信号掩码。
  2. 信号阻塞和忽略的区别
  阻塞的概念与忽略信号是不同的:操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,
  信号只是暂时被阻止传递;当进程忽略一个信号时,信号会被传递出去,但进程将信号丢弃。
  3. 信号集的操作
  信号集可以由以下几个函数操作:
  int sigemptyset(sigset_t *set); //清空信号集
  int sigfillset(sigset_t *set); //将所有信号填充进set中
  int sigaddset(sigset_t *set, int signum); //往set中添加信号signum
  int sigdelset(sigset_t *set, int signum); //从set中移除信号signum
  int sigismember(const sigset_t *set, int signum); //判断signnum是不是包含在set中,在返回1,不在返回0
  初始化往往可以用sigemptyset()将信号集清空,再用sigaddset()向信号集中添加信号;或者可以使用sigfillset()
  将所有信号添加到信号集,再用sigdelset()将某信号从中删除掉。
  int sigpending(sitset_t *set);// 获取未决信号,未决信号指信号产生到被进程处理之前的状态。set 输出参数,
  处于未决状态的信号集。0,调用成功,-1,调用失败。
  int sigsuspend(const sigset_t *set); set输入参数,表示阻塞信号集。其工作过程如下:
          A.设置进程的信号掩码并阻塞进程
          B.收到信号,恢复原来的信号掩码
          C.调用那个进程设置的信号处理函数
          D.等待信号处理函数返回,sigsuspend返回。
      四步操作一次性完成,保证其原子性。

         int sigqueue(pid_t pid, int signum, union sigval val);发送信号,同时附加数据。
          union sigval 结构
          typedef union sigval{
              int sigval_int;
              void * sigval_ptr;
          }sigval_t;
      pid: 目的进程ID
      signum:要发送的信号,例如:SIGINT
      val: 附加的信息,为int或者void * 指针。
      例:sigval_t val.sigval_ptr="this is the message";
      sigqueue(getpid(),SIGINT,val);为向自己发送SIGINT信号,附加数据val
  4. sigprocmask()介绍
  可以使用函数sigprocmask()来检查或者修改进程的信号掩码。函数信息如下:
  #include <signal.h>
  int sigprocmask ( int how, const sigset_t *restrict set,sigset_t *restrict old );
  参数how 是一个整数,说明信号掩码的修改方式:
  SIG_BLOCK  将set指向的信号集中的信号添加到当前阻塞信号集中;
  SIG_UNBLOCK  从当前阻塞信号集中移除set指向的信号集中的信号;
  SIG_SETMASK指定set所指向的信号集为当前阻塞信号集。
  此外,如果参数set为NULL, 说明不需要修改,如果old 为NULL,sigprocmask会将修改之前的信号集放在*old 之中返回。
    例子:

版权声明:本文为博主原创文章,未经博主允许不得转载。

linux信号的阻塞和未决

执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解...
  • Linux_ever
  • Linux_ever
  • 2015年12月17日 17:41
  • 1992

Linux网络编程--信号阻塞与屏蔽(block,unblock)

Linux下当向一个进程发出信号时,从信号产生到进程接收该信号并执行相应操作的过程称为信号的等待过程(呃,根据对APUE的理解翻译的)。如果某一个信号没有被进程屏蔽,则我们可以在程序中阻塞进程对该信号...
  • u010193457
  • u010193457
  • 2015年09月10日 15:02
  • 1708

阻塞信号和捕捉信号

一 阻塞信号 1 概念: 信号递达:实际执行信号的处理动作称为信号递达(Delivery)。 信号未决:信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞(Block )某...
  • Stand__out
  • Stand__out
  • 2016年07月27日 00:10
  • 1098

linux 信号阻塞和信号未决

信号的“未决”是一种状态,指的是从信号的产生到信号被处理前的这一段时间; 信号的“阻塞”是一个开关动作,指的是阻止信号被处理,但不是阻止信 号产生。 信号的阻塞就是让系统暂时保留信号留待以后发...
  • u012349696
  • u012349696
  • 2016年03月20日 14:52
  • 905

linux系统编程之信号(三):信号的阻塞与未决

一、信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Block)某个信号。被阻塞的信号产生时将...
  • Simba888888
  • Simba888888
  • 2013年05月18日 21:52
  • 5937

【Linux】阻塞信号

LInux中信号产生的原因大致有一下三种: 键盘中断命令发出异常产生中断 但归根结底,这些信号其实都是最终有操作系统发出的。 常见的对信号的处理,无外乎以下三种: 忽略终止该进程自定义行为 对信号...
  • qq_33724710
  • qq_33724710
  • 2016年07月09日 22:29
  • 344

阻塞信号

      信号的阻塞就是让系统暂时保留信号待以后发送。由于另外有办法让系统忽略信号,所以一般情况下信号的阻塞只是暂时的,只是为了防止信号打断敏感的操作。           当需要修改某些全局变量时...
  • allwtg
  • allwtg
  • 2010年01月12日 21:01
  • 5164

linux信号--阻塞信号

1. 信号在内核中的表示 我们知道了信号产生的各种原因,而实际执行信号处理的动作,叫做信号递达(Delivery)。信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞(Blo...
  • magoyang
  • magoyang
  • 2016年07月09日 12:59
  • 759

linux基础——linux下五种IO模型小结(阻塞IO、非阻塞IO、IO复用、信号驱动式IO、异步IO)

一、阻塞IO模型 (同步I/O) 阻塞IO是指进程进行IO操作的时候,因为数据没准备好或者缓冲区里没有空间而无法进行IO操作会进入睡眠,直到数据准备或者缓冲区有空间才回被唤醒的行为。阻塞IO是最通用的...
  • a987073381
  • a987073381
  • 2016年08月13日 19:50
  • 1203

关于linux环境下信号SIGCHLD的排队机制

2006-05-31 11:38:35 分类: LINUX 一直对这个问题没有深入的思考过。最近由于项目的需要终于弄清了这个问题。 以下文字是抄袭+理解+估计: 在linux系统中,...
  • pzqingchong
  • pzqingchong
  • 2016年10月18日 21:35
  • 378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 信号简介三 信号阻塞处理
举报原因:
原因补充:

(最多只允许输入30个字)