linux 信号相关概念

转载 2015年07月09日 20:17:24

信号的阻塞就是让系统暂时保留信号待以后发送。由于另外有办法让系统忽略信号,所以一般情况下信号的阻塞只是暂时的,只是为了防止信号打断敏感的操作。

     

      当需要修改某些全局变量时,可以通过sigprocmask()函数阻塞处理函数中也使用该变量的信号。

      在某些信号处理函数中,为了防止同类信号的到来,可以使用sigaction()函数的sa_mask阻塞特定的信号。

 

阻塞信号的作用

      使用函数sigprocmask()阻塞信号的传递,只是延迟信号的到达。信号会在解除阻塞后继续传递。这种情况往往需要在信号程序和其它程序共享全局变量时,如果全局变量的类型不是sig_atomic_t类型,当一部分程序恰好读、写到变量过程中,产生某个信号,而信号程序里会改变该变量,那么就会产生混乱。为了避免这种混乱,提供程序的可靠性,你必须在操作这类变量前阻塞信号,操作完成后恢复信号的传递。

 

信号集

      所有的信号阻塞函数都使用称作信号集的数据结构来表明受到影响的信号。每一个操作都包括两个阶段:创建信号集,传递信号集给特定的库函数。下面说明信号集和相关的数据类型:
      sigset_t:这个数据类型用来代表信号的集合,有两种方法对它进行初始化。一种是通过函数sigemptyset()使之不包含任何信号,然后用sigaddset()函数加入需要的信号。另一种方法是通过函数sigfillset()使之包含所以信号,然后通过sigdelset()函数删除我们不需要的信号。注意,千万不用试图通过手工方式直接操作这种类型变量,否则会带来严重的错误。下面介绍相关的函数。
      int sigemptyset(sigset_t *set):初始化信号集set使之不包含任何信号,这个函数总是返回0。
      int sigfillset(sigset_t *set):初始化信号集set使之包含所有的信号,这个函数也是总返回0。
      int sigaddset(sigset_t *set, int signum):该函数把信号signum加入到信号集set中,需要注意的是这个函数只是修改了set变量本身,并不作其它操作。该函数成功操作返回0,失败返回-1,错误代码设置成EINVAL,表示signum不是有效的信号代码。
      int sigdelset(sigset_t *set, int signum):该函数从信号集set中删除信号signum,其它方面和sigaddset()函数类似,不再赘述。
      int sigismember(const sigset_t *set,int signum):这个函数测试信号signum是否包含在信号集合set中,如果包含返回1,不包含返回0,出错返回-1。错误代码也只有一个EINVAL,表示signum不是有效的信号代码。

进程的信号掩码

      我们称正在阻塞的信号的集合为信号掩码(signal mask)。每个进程都有自己的信号掩码,创建子进程时子进程将继承父进程的信号掩码。我们可以通过修改当前的信号掩码来改变信号的阻塞情况。
      int sigprocmask(int how, const sigset_t *set,sigset_t *oldset),该函数用来检查和改变调用进程的信号掩码,其中的how参数指出信号掩码改变的方式,必须是下面的值之一:
      SIG_BLOCK,阻塞set中包含的信号。意思是说把set中的信号加到当前的信号掩码中去,新的信号掩码是set和旧信号掩码的并集。
      SIG_UNBLOCK,解除set中信号的阻塞,从当前信号掩码中去除set中的信号。
      SIG_SETMASK,设置信号掩码,既按照set中的信号重新设置信号掩码。

       最后一个参数是进程原来的信号集。如果你只需要改变信号的阻塞情况而不需要关心原来的值,可以传递NULL指针给函数。如果你希望什么也不改变,只是想获得当前信号掩码的信息,那么把set设置成NULL,old中返回当前的设置。
      sigprocmask()函数成功返回0,失败返回-1。失败时错误代码只可能是EINVAL,表示参数how不合法。

      不能阻塞SIGKILL和SIGSTOP等信号,但是当set参数包含这些信号时sigprocmask()不返回错误,只是忽略它们。另外,阻塞SIGFPE这样的信号可能导致不可挽回的结果,因为这些信号是由程序错误产生的,忽略它们只能导致程序无法执行而被终止。
  

举例:禁止关键代码时信号到达

      假定你建立信号SIGALRM的处理函数,在其中设置一个标志。主程序中检查标志并清除,使用函数sigprocmask()控制信号到达:
   #include 
   volatile sig_atomic_t flag=0;
   
   int
   main(void)
   {
       sigset_t block_alarm;
       ... ...
       sigemptyset(&block_alarm);
       sigaddset(&block_alarm,SIGALRM);
       while(1)
       {
           sigprocmask(SIG_BLOCK,&block_alarm,NULL);
           if(flag)
           {
               ... ...
               flag=0;
           }
           sigprocmask(SIG_UNBLOCK,&block_alarm,NULL);
           ... ...
       }
   }

linux的信号的基本概念

信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。      进程之间可以互相通过系统调...
  • coolmeme
  • coolmeme
  • 2013年07月17日 15:15
  • 1195

Linux网络编程:信号

一、为了理解信号,先从我们最熟悉的场景说起: 1. 用户输入命令,在Shell下启动一个前台进程。 2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断。 3. 如果CPU当前正在执行这个进...
  • u012814360
  • u012814360
  • 2014年09月14日 16:47
  • 649

apue-信号相关概念

1,genercation: 信号产生 2,delivery: 信号递送 3,pending: 处于generation和delivery之间那段时间。处于阻塞阶段。通过si...
  • wusoule
  • wusoule
  • 2013年04月16日 14:07
  • 778

信号相关概念

我记得我在进程间通信的时候说到过一种方式——信号量;终止在linux命令行上正在运行的可执行程序所用的ctrl+c,也属于一种信号(是常见SIGINT信号),所以,今天我想具体分享一下与信号相关的一些...
  • sd_bit19
  • sd_bit19
  • 2017年06月30日 21:29
  • 75

信号章节相关概念

//--------------------------------------------------------------- 1. core文件的简单介绍 //---------------...
  • yainyiyi123
  • yainyiyi123
  • 2014年08月14日 10:18
  • 409

信号处理:自相关和互相关

1. 首先说说自相关和互相关的概念。     这个是信号分析里的概念,他们分别表示的是两个时间序列之间和同一个时间序列在任意两个不同时刻的取值之间的相关程度,即互相关函数是描述随机信号x(t),y(...
  • chenhuijie666
  • chenhuijie666
  • 2015年04月12日 20:43
  • 4472

信号(互)相关及其应用

互相关函数有许多实际的用途,比如通过不同的传感器检测不同方向到达的声音信号,通过对不同方位传感器间的信号进行互相关可计算声音到达不同传感器间的时延。自相关函数还可以用来计算周期信号的周期。对此,有时间...
  • xiahouzuoxin
  • xiahouzuoxin
  • 2014年02月16日 17:35
  • 15853

笔记:linux必备网络基础概念和以太网技术基础

笔记:linux必备网络基础概念和以太网技术基础 由于后面可能需要对交换机进行一些配置,所以也是临时学习一下iptables的相关配置,以及一些基本的网络知识,下面就是我看到一些资料...
  • longbei9029
  • longbei9029
  • 2016年11月06日 16:56
  • 276

LINUX 信号概念

“信号”是LINUX,UNIT特有的一种进程间通讯方式。一个进程可以给自已或其它进程发信号,以便控制自已或其它进程的行为。 信号的产生:是由某些系统调用函数、键盘操作、硬件故障、系统异常产生。 信...
  • hm2462964492
  • hm2462964492
  • 2014年03月05日 11:35
  • 504

信号基本概念

信号
  • qq_20218109
  • qq_20218109
  • 2016年08月04日 16:44
  • 1193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 信号相关概念
举报原因:
原因补充:

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