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

时间:2018-07-10 02:08:32

标签: linux linux-kernel signals signal-handling

有一些方法可以对Linux signal handlers进行一些工作。

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

战略1: 但是,如果没有源代码,我们如何捕获signals到应用程序以对其进行处理并返回? (不是一次调试,而是永久功能)。 [可能是入侵system call吗?]

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

2 个答案:

答案 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 :(我不建议这种方法),您可以使用它为每个信号设置处理程序,并用两个包装函数替换signalsigaction以防止程序覆盖信号处理程序(请注意this other answer中的建议)。