在将SIGUSR1或SIGINT发送到停止进程之前未捕获信号,直到您继续该过程 - 为什么?

时间:2014-02-07 04:01:20

标签: process signals

为什么当你停止一个进程然后尝试用SIGUSR1或SIGINT终止它时,在发送SIGCONT之前信号是否被捕获?但是当你用SIGKILL终止它时,信号会被立即捕获?

在我们自己的shell中,我们在gdb中遵循了这一点。在继续该过程之前,信号根本没有被捕获。我们发送SIGCONT信号后,父进程的SIGCHLD处理程序捕获了它,并且子进程的WIFSIGNALED(status)返回true(意味着信号没有被捕获,对吗?)。

常规Linux shell将SIGUSR1发送到已停止的进程:

$ ./testing 30
^Z
[1]+  Stopped                 ./testing 30
$ ps
  PID TTY          TIME CMD
 2775 pts/2    00:00:00 bash
 4668 pts/2    00:00:00 testing
 4669 pts/2    00:00:00 ps
$ kill -SIGUSR1 4668
$ ps
  PID TTY          TIME CMD
 2775 pts/2    00:00:00 bash
 4668 pts/2    00:00:00 testing
 4670 pts/2    00:00:00 ps
$ kill -SIGCONT 4668
$ ps
  PID TTY          TIME CMD
 2775 pts/2    00:00:00 bash
 4671 pts/2    00:00:00 ps
[1]+  User defined signal 1   ./testing 30
$ 

常规Linux shell将SIGINT发送到已停止的进程:

$ ./testing 30
^Z
[1]+  Stopped                 ./testing 30
$ ps
  PID TTY          TIME CMD
 2775 pts/2    00:00:00 bash
 4691 pts/2    00:00:00 testing
 4692 pts/2    00:00:00 ps
$ kill -SIGINT 4691
$ ps
  PID TTY          TIME CMD
 2775 pts/2    00:00:00 bash
 4691 pts/2    00:00:00 testing
 4702 pts/2    00:00:00 ps
$ kill -SIGCONT 4691
$ ps
  PID TTY          TIME CMD
 2775 pts/2    00:00:00 bash
 4703 pts/2    00:00:00 ps
[1]+  Interrupt               ./testing 30
$

常规Linux shell将SIGKILL发送到已停止的进程:

$ ./testing 30
^Z
[1]+  Stopped                 ./testing 30
$ ps
  PID TTY          TIME CMD
 5243 pts/2    00:00:00 bash
 5331 pts/2    00:00:00 testing
 5332 pts/2    00:00:00 ps
$ kill -SIGKILL 5331
$ ps
  PID TTY          TIME CMD
 5243 pts/2    00:00:00 bash
 5334 pts/2    00:00:00 ps
[1]+  Killed                  ./testing 30
$

1 个答案:

答案 0 :(得分:1)

无法阻止

SIGKILLSIGUSR1SIGINT可以。