sigaction函数和signal函数

sigaction函数和signal函数signal和sigaction的区别:signal都是指以前的oldersignal函数,现在大多系统都用sigaction重新实现了signal函数。1.      signal在调用handler之前先把信号的handler指针恢复;sigaction调用之后不会恢复handler指针,直到再次调用sigaction修改handler指针。这样,signal就会丢失信号,而且不能处

大家好,又见面了,我是你们的朋友全栈君。

signalsigaction的区别:

signal都是指以前的older signal函数,现在大多系统都用sigaction重新实现了signal函数。

1.      signal在调用handler之前先把信号的handler指针恢复;sigaction调用之后不会恢复handler指针,直到再次调用sigaction修改handler指针。这样,signal就会丢失信号,而且不能处理重复的信号,而sigaction就可以。因为signal在得到信号和调用handler之间有个时间把handler恢复了,这样再次接收到此信号就会执行默认的handler。(虽然有些调用,在handler的以开头再次置handler,这样只能保证丢信号的概率降低,但是不能保证所有的信号都能正确处理)

2.      signal在调用过程不支持信号blocksigaction调用后在handler调用之前会把屏蔽信号(屏蔽信号中自动默认包含传送的该信号)加入信号中,handler调用后会自动恢复信号到原先的值。

3.      signal处理过程中就不能提供阻塞某些信号的功能,sigaction就可以阻指定的信号和本身处理的信号,直到handler处理结束。这样就可以阻塞本身处理的信号,到handler结束就可以再次接受重复的信号。

 

sigaction函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。

         #include<signal.h>

         intsigaction(int signo, const struct sigaction* act,struct sigaction* oact) ;

其中,参数signo是要检测或修改具体动作的信号的编号数。

act指针非空,则要修改其动作。

oact指针非空,则系统返回该信号的原先动作。

此函数使用下列结构:

struct sigaction {

         void (*sa_handler)();/* addr of signal handler,or SIG_IGN, or SIG_DFL */

         sigset_t  sa_mask; /* additional signals to block */

         int sa_flags; /*signal options, Table 10-5 */

} ;

当更改信号动作时,如果sa_handler指向一个信号捕捉函数(不是常数SIGIGNSIGDFL),则sa_mask字段说明了一个信号集,在调用信号捕捉函数之前,该信号集要加到进程的信号屏蔽字中,仅当从信号捕捉函数返回时再将进程的信号屏蔽字恢复为原先值,这样,在调用信号处理程序时就能阻塞某些信号。在信号处理程序被调用时,系统建立的新信号屏蔽字会自动包括正被递送的信号。因此保证了在处理一个给定的信号时,如果这种信号再次发生,那么它会被阻塞到对前一个信号的处理结束为止。若同一种信号多次发生,通常并不将它们排队,所以如果在某种信号被阻塞时,它发生了五次,那么对这种信号解除阻塞后,其信号处理函数通常只会被调用一次。

sa_flags :信号处理选择项标志 

一旦对给定的信号设置了一个动作,那么在用sigaction改变它之前,该设置就一直有效。

 

sigaction实例请参考下一篇博客

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141543.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 详解 Java 内部类

    详解 Java 内部类前言内部类在Java里面算是非常常见的一个功能了,在日常开发中我们肯定多多少少都用过,这里总结一下关于Java中内部类的相关知识点和一些使用内部类时需要注意的点。从种类上说,内部类可以分为四类:普通内部类、静态内部类、匿名内部类、局部内部类。我们来一个个看:普通内部类这个是最常见的内部类之一了,其定义也很简单,在一个类里面作为类的一个字段直接定义就可以了,例:pub…

    2022年10月11日
    1
  • linux常用命令vi 退出_vi命令退出

    linux常用命令vi 退出_vi命令退出进入编辑模式,按o进行编辑编辑结束,按ESC键跳到命令模式,然后输入退出命令::w保存文件但不退出vi编辑:w!强制保存,不退出vi编辑:wfile将修改另存到file中,不退出vi编辑:wq保存文件并退出vi编辑:wq!强制保存文件并退出vi编辑q:不保存文件并退出vi编辑:q!不保存文件并强制退出vi编辑:e!放弃所有修改,从上次保…

    2022年9月30日
    0
  • 所谓齐次坐标就是用_什么叫齐次

    所谓齐次坐标就是用_什么叫齐次目录[第一篇:关于齐次坐标的理解(经典)](https://blog.csdn.net/janestar/article/details/44244849)[第二篇:齐次坐标的理解](http://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.html)[第三篇:如何通俗的解释仿射变换?](https://www.matongxue.co…

    2025年7月16日
    0
  • 手持频谱仪的使用_频谱仪使用教程视频

    手持频谱仪的使用_频谱仪使用教程视频手持频谱仪的使用

    2022年8月11日
    3
  • Matlab机器人工具箱

    Matlab机器人工具箱因为需要用到和机器人相关的东西,就用到了这个工具箱,作者官网http://www.petercorke.com/Robotics_Toolbox.html文章开头有我上传的机器人工具箱链接,有需要的同学可以自行下载。CSDN下载积分不能设置为0,抱歉~没有积分的同学可以去官网下载搞定。老爷子很厉害,那本《Robotics,Vision&Control》就是他本人写的,可…

    2022年4月30日
    54
  • c语言fsync函数,c – 如何在一个流上做fsync?

    c语言fsync函数,c – 如何在一个流上做fsync?不幸的是,查看标准没有提供basic_filebuf或任何basic_[io]?fstream类模板,以允许您提取底层的操作系统文件描述符(以fileno()为CstdioI/O的方式).也没有一个open()方法或构造函数将这样的文件描述符作为参数(这将允许您使用不同的机制打开文件并记录文件句柄).有basic_ostream::flush(),但是我怀疑这实际上并不调用fsyn…

    2022年5月23日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号