信号处理:打印一些东西然后采取默认行为

时间:2015-09-08 10:39:55

标签: linux signals

我的要求是,只要程序以正常完成以外的任何方式终止[即最后的exit()系统调用],我需要在它实际终止之前处理它(比如挂钩打印“Hello”语句)。
例如,当我在运行程序时点击Ctrl+C时,它应该打印Hello并继续执行SIGINT必须处理的方式。 如果我在源代码中使用自定义信号处理函数(具有打印语句逻辑),它将改变默认行为,即SIGINT理想地终止的方式。

1)任何人都可以帮我实现这两个目标吗?我需要明确处理哪些其他信号(可能是SIGTERM?),这可能会导致正在运行的进程终止? 2)如何生成/测试它们?(例如,通过点击SIGINT中的Ctrl + C可以生成linux

2 个答案:

答案 0 :(得分:1)

unix / linux支持几种信号。 除了SIGKILL,SIGSTOP,所有其他人都可以被解释和处理。 将处理程序注册到特定标记的过程应该是相同的。

我们可以使用kill命令将信号发送到其他进程。 例如:它将TERM信号发送到processid 1234 杀死-TERM 1234

答案 1 :(得分:0)

sigaction(2)手册页有一些有用的信息。首先,除了SIGKILLSIGSTOP之外,每个信号都可以被捕获。

在信号处理程序中,您有两个选择:

  • puts(3)然后手动执行某些操作(exit()raise(SIGSTOP)或其他内容。)
  • puts(3)然后尝试通过将处理程序设置回SIG_DFL来获取默认信号行为,并使用raise(3)将信号发送给自己。我不确定你是否可以sigaction()在信号处理程序内部raise()后立即恢复你的信号处理程序,以及它是否可以移植,即使它恰好在Linux上运行。

列出kill -l

的所有信号

使用kill -INT 1234发送信号,或者在您开始后台处理的shell中发送信号:kill -INT %1。或者每次都避免复制/粘贴PID:pkill -INT process_namepkillpgrep相关。)