10.15 信号_sigsetjmp和siglongjmp函数

来源:互联网 发布:ios js rsa 编辑:程序博客网 时间:2024/06/05 06:22

    在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回。但是,调用longjmp有一个问题。当捕捉到一个信号时,进入信号捕捉函数,此时当前信号被自动地加到进程的信号屏蔽字中。这阻止了后来产生的这种信号中断该信号处理程序。

    POSIX.1并没有说明setjmp和longjmp对信号屏蔽字的作用,而是定义了两个新函数sigsetjmp和siglongjmp。在信号处理程序中进行非局部转移时应当使用这两个函数。

  • #include <setjmp.h>
  • int sigsetjmp(sigjmp_buf env, int savemask);

返回值:直接调用返回0,从siglongjmp调用返回则返回非0值

  • int siglongjmp(sigjmp_buf env, int val);

    这两个函数与setjmp和longjmp之间的唯一区别是sigsetjmp增加了一个参数。如果savemask非0,则sigsetjmp在env中保存进程的当前信号屏蔽字。调用siglongjmp时,如果带非0 savemask的sigsetjmp调用已经保存了env,则siglongjmp从其中恢复保存的信号屏蔽字。

原创粉丝点击