有一些方法可以对Linux signal handlers
进行一些工作。
strace
下运行该过程以查看它们。 战略1:
但是,如果没有源代码,我们如何捕获signals
到应用程序以对其进行处理并返回? (不是一次调试,而是永久功能)。 [可能是入侵system call
吗?]
战略2:
如果我们确实有源代码,那么在有多个信号的情况下写入文件是否安全?还是在fork()
进程中执行信号处理程序并丢弃SIGCHLD
更安全?如果在处理上一个信号时出现另一个信号会发生什么?
答案 0 :(得分:2)
对于您的 Stratergy 2 ,取决于日志文件的写入方式以及信号的触发方式(是否异步)。通常, stdio 库函数不是异步信号安全的。
查看http://man7.org/linux/man-pages/man7/signal-safety.7.html
中的详细信息To avoid problems with unsafe functions, there are two possible choices: 1. Ensure that (a) the signal handler calls only async-signal-safe functions, and (b) the signal handler itself is reentrant with respect to global variables in the main program. 2. Block signal delivery in the main program when calling functions that are unsafe or operating on global data that is also accessed by the signal handler.
答案 1 :(得分:0)
战略1:但是,如果我们没有源代码,我们如何捕获到应用程序的信号以对其进行处理并返回? (不是一次调试,而是永久功能)。 [可能会入侵系统吗?]
要拦截传递给进程的信号,至少有两种方法:
ptrace(2)
(strace
的用法)参见this answer作为示例。LD_PRELOAD
:(我不建议这种方法),您可以使用它为每个信号设置处理程序,并用两个包装函数替换signal
和sigaction
以防止程序覆盖信号处理程序(请注意this other answer中的建议)。