Linux

如何找出 POSIX 信號的來源

  • February 17, 2020

有沒有辦法找出 Red Hat Enterprise Linux 5(SIGTERM 等)中發送的信號的來源?我經常在應用程序中擷取一個 TERM,但我不知道它來自哪裡。

的手冊頁sigaction(2)建議信號發送者的 PID 在傳遞給信號處理程序的 siginfo_t 結構中可用。這顯然需要您使用 sigaction()。

從手冊頁:

sigaction 結構定義為:

  struct sigaction {
      void     (*sa_handler)(int);
      void     (*sa_sigaction)(int, siginfo_t *, void *);
      sigset_t   sa_mask;
      int        sa_flags;
      void     (*sa_restorer)(void);
  };

siginfo_t結構如下所示:

  siginfo_t {
      int      si_signo;    /* Signal number */
      int      si_errno;    /* An errno value */
      int      si_code;     /* Signal code */
      int      si_trapno;   /* Trap number that caused
                               hardware-generated signal
                               (unused on most architectures) */
      pid_t    si_pid;      /* Sending process ID */
      uid_t    si_uid;      /* Real user ID of sending process */
      int      si_status;   /* Exit value or signal */
      clock_t  si_utime;    /* User time consumed */
      clock_t  si_stime;    /* System time consumed */
      sigval_t si_value;    /* Signal value */
      int      si_int;      /* POSIX.1b signal */
      void    *si_ptr;      /* POSIX.1b signal */
      int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
      int      si_timerid;  /* Timer ID; POSIX.1b timers */
      void    *si_addr;     /* Memory location which caused fault */
      int      si_band;     /* Band event */
      int      si_fd;       /* File descriptor */
  }

引用自:https://serverfault.com/questions/94956