我的要求是,只要程序以正常完成以外的任何方式终止[即最后的exit()系统调用],我需要在它实际终止之前处理它(比如挂钩打印“Hello”语句)。
例如,当我在运行程序时点击Ctrl+C
时,它应该打印Hello
并继续执行SIGINT
必须处理的方式。
如果我在源代码中使用自定义信号处理函数(具有打印语句逻辑),它将改变默认行为,即SIGINT
理想地终止的方式。
1)任何人都可以帮我实现这两个目标吗?我需要明确处理哪些其他信号(可能是SIGTERM
?),这可能会导致正在运行的进程终止?
2)如何生成/测试它们?(例如,通过点击SIGINT
中的Ctrl + C
可以生成linux
答案 0 :(得分:1)
unix / linux支持几种信号。 除了SIGKILL,SIGSTOP,所有其他人都可以被解释和处理。 将处理程序注册到特定标记的过程应该是相同的。
我们可以使用kill命令将信号发送到其他进程。 例如:它将TERM信号发送到processid 1234 杀死-TERM 1234
答案 1 :(得分:0)
sigaction(2)
手册页有一些有用的信息。首先,除了SIGKILL
和SIGSTOP
之外,每个信号都可以被捕获。
在信号处理程序中,您有两个选择:
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_name
(pkill
和pgrep
相关。)