如何使用日志处理程序将信号记录到应用程序信号



有一些方法可以使用linuxsignal handlers进行一些工作。

  1. 我们可以为每个信号注册系统处理程序(如果我们有源代码(,或者
  2. strace下运行进程以查看它们

Stratergy 1:但是如果我们没有源代码,我们如何将signals捕获到应用程序中,用它做一些事情并返回?(不是一次性调试,而是永久性功能(。[可能是破解system call?]

Straergy 2:如果我们确实有源代码,在出现多个信号的情况下,写入文件是否安全?还是在fork()进程中执行信号处理程序并丢弃SIGCHLD更安全?如果在处理前一个信号时出现另一个信号,会发生什么?

对于Straergy 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.

Stratergy 1:但是,如果我们没有源代码,我们如何捕捉到对应用程序进行处理的信号并返回?(不是一次性调试,而是永久性功能(。[可能正在破解系统调用?]

要拦截传递给进程的信号,至少有两种方法:

  • ptrace(2)(这是strace使用的(请参阅此答案作为示例
  • LD_PRELOAD:(我不建议使用这种方法(您可以使用它为每个信号设置处理程序,并用两个包装函数替换signalsigaction,以防止程序覆盖您的信号处理程序(请注意另一个答案中的建议(

最新更新