您的位置:首页 > 编程语言

unix 环境高级编程 信号三态

2014-07-03 12:22 295 查看
      信号的产生:

              这个不用说吧。apue上面说了几种信号产生的原因。

       信号递达:

             信号递达指的是信号处理函数被调用,进行信号的处理.

       信号未决:

              信号在产生与递达之间的状态称为信号的未决。

       我们知道在未设置信号阻塞的情况下,当有信号产生的时候会中断当前代码的执行,转去执行相应的信号处理函数,这时候就有可能出现信号重入的问题.所以这个时候我们可以设置信号的阻塞。信号的阻塞不是指的信号被忽略,而是指的信号的在递达之前,进程运行的当前代码段不会被中断。至于进程什么时候接触对信号的阻塞,apue上面没有提到。

        apue上面提到:如果为进程产生一个选择为阻塞的信号,而且对这个信号的动作是系统默认的动作或者是用户自定义信号处理函数,则为该进程将此信号保持为未决状态,直到进程对此信号解除了阻塞或者是该信号的动作是忽略.这里也就是说当信号的处理动作是忽略的时候,是不会处于未决状态的.信号的处理方式是在递达之前被决定的,而不是在信号产生的时候决定的,也就是说我们可以在信号处于阻塞未决的时候,改变信号的处理函数.

        unix利用信号屏蔽字(signal mask)来设置信号的阻塞位,由于不同的系统中信号的数量是不一定相同的,用整型来表示信号屏蔽字不一定够用,从而就有了sigset_t 数据类型来表示信号屏蔽字。sigset_t 的每一位表示一个特定的信号是否阻塞。

        注意的是:unix在PCB中维持了两个sigset_t 类型的变量,一个用来设置信号屏蔽字,一个用来判定哪些信号处于阻塞且为未决状态.相应的函数是sigpromask与sigpending

              

  

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unix 信号三态