linux - 在 Linux 中链接信号处理程序的正确方法?

标签 linux signals

我有几个信号处理程序,我正在使用它们来干净地退出我的程序,并且我想通过链接信号处理程序调用来很好地处理任何其他 Hook 它们的东西。我在手册页中使用 sigaction 来表示它不再是首选。

查看 sigaction 结构,其中指定了信号掩码等,以及几个标志。调用当前安装的处理程序以便将所有这些选项都考虑在内的“正确”方法是什么?

最佳答案

答案是“这取决于”:信号处理程序做什么:

  • 许多人的第一 react 是信号处理程序将用于处理 SIGINT 等,并彻底终止程序。
  • 另一方面,存在(或多或少)良性信号,例如 SIGWINCH(您希望停止您的程序)。

在“干净地终止一个程序”中,可能没有空间让其他程序做一些有用的事情。例如,建议的链式处理程序可能会关闭您依赖的文件。因此,您必须首先充分了解其他处理程序的作用。

如果信号处理程序在后一类中,只需更新应用程序可以测试的变量,那么信号处理程序函数 只是另一个函数。当您调用 signal 将信号与函数相关联时,它会返回前一个处理程序(可能是神奇值之一,例如。SIG_DFLSIG_IGN )。如果你保存它,就可以检查它是否不是那些,并且(大概)是一个真正的功能。调用那个函数会继续执行,就好像它是您当前信号处理程序的一部分一样。

这不是一个新想法(我在 1990 年代后期使用过它),并且偶尔会被讨论:

当然还有:

关于linux - 在 Linux 中链接信号处理程序的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36044772/

相关文章:

linux - 为什么 kill 函数在 linux 中不起作用

c - 试图在 Linux 上关闭 sleep

c - 我应该重置 SIGINT/SIGTERM 上的 termios 设置吗?

linux - 无法从 Linux bash 中的文本文件中删除隐藏字符

c++ - 处理客户端连接的最有效方式(套接字编程)

c - 防止死锁

linux - 在 Linux 中批量重命名文件

linux - 使用信号捕获 fork 时程序变得无限

linux - 当父进程被 "kill -9"杀死时,子进程是否也会被杀死?

c++ - sigaction : using "void (*sa_sigaction)(int, siginfo_t *, void *);"