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 信号处理机制简介

鉴于后面把进程的形象给彻底毁掉了,我提前声明一下,进程是有尊严的有节操的,当然大部分人可能也看不到毁形象那一段。为什么介绍linux要从信号开始呢,当然是为了保证能讲明白,因为翻了翻书我发现这一部分是...
  • ebw123
  • ebw123
  • 2015年12月27日 21:53
  • 306

Linux定时器处理之实时信号使用,消息队列阻塞模型,避免超时等待

man msgrcv翻到msgrcv函数英文有段话说明了,意思是这样,当msgrcv所在的进程捕获到一个信号的时候,该函数会调用失败并且把errno设置为EINTR,也就是说这个时候msgrcv就不会...

linux网络编程之进程间通信基础(二):死锁、信号量与PV原语简介

一、死锁 (1) 死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。 (2)死锁...

Linux信号量 sem_t简介

函数介绍 #include 信号量的数据类型为结构sem_t,它本质上是一个长整型的数。 函数sem_init()用来初始化一个信号量。它的原型为:int sem_init __P ((sem_t *...
  • evsqiezi
  • evsqiezi
  • 2012年10月11日 16:27
  • 19952

linux信号量简介(用户态)

一、说明     用户态进程使用的信号量又分为POSIX信号量和SYSTEM V信号量。POSIX信号量又分为有名信号量和无名信号量。有名信号量,其值保存在文件中, 所以它可以用于线程也可以用于进程间...

Linux信号简介 .

作者:李智敏,华清远见嵌入式学院上海中心讲师。一、信号及信号来源信号本质信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个...

linux 信号简介

信号是一种软件中断,提供了一种处理异步的方法,信号发生是随机的。可以被发送到一个进程或一组进程;使用信号的主要目的有两个: 让进程知道已经发生了一个特定的事件; 强迫进程执行它自己代码中的信号处理...

Linux中的信号简介

(转载,原文链接http://www.uml.org.cn/c++/200812083.asp) 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大...

linux 信号简介一

信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。 signal,信号用来通知某进程发...
  • JK1860
  • JK1860
  • 2011年01月18日 23:36
  • 692

linux网络编程之进程间通信基础(二):死锁、信号量与PV原语简介

一、死锁 (1) 死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。(2)死锁产生...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 信号简介三 信号阻塞处理
举报原因:
原因补充:

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