Process 在继续进程之前,将SIGUSR1或SIGINT发送到已停止进程时未捕获信号——为什么?

Process 在继续进程之前,将SIGUSR1或SIGINT发送到已停止进程时未捕获信号——为什么?,process,signals,Process,Signals,为什么当您停止一个进程,然后尝试用SIGUSR1或SIGINT终止它时,直到您发送SIGCONT,信号才被捕获?但是当你用SIGKILL终止它时,信号马上就被捕获了 在我们自己的shell中,我们在gdb中遵循了这一点。在继续该过程之前,信号根本不会被捕获。父进程的SIGCHLD处理程序在发送SIGCONT信号后捕捉到它,子进程的WIFSIGNALED(status)返回true(这意味着之前没有捕捉到该信号,对吗?) 常规Linux shell将SIGUSR1发送到已停止的进程: $ ./te

为什么当您停止一个进程,然后尝试用SIGUSR1或SIGINT终止它时,直到您发送SIGCONT,信号才被捕获?但是当你用SIGKILL终止它时,信号马上就被捕获了

在我们自己的shell中,我们在gdb中遵循了这一点。在继续该过程之前,信号根本不会被捕获。父进程的SIGCHLD处理程序在发送SIGCONT信号后捕捉到它,子进程的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
$ 
$ ./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
$
$ ./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
$
常规Linux shell将SIGINT发送到已停止的进程:

$ ./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
$ 
$ ./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
$
$ ./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
$
常规Linux shell向停止的进程发送SIGKILL:

$ ./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
$ 
$ ./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
$
$ ./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
$

SIGKILL
无法阻止
SIGUSR1
SIGINT
可以。

那么发送SIGTSTP信号会自动阻止它们吗?这取决于代码要求什么。例如,如果您使用
sigaction
,您可以通过设置
sau mask
参数来控制它。(我自己的shell只是为了看看信号在gdb中的位置)如果你不要求任何特殊的东西,你就不会得到任何特殊的东西。所以默认情况下,SIGTSTP会自动阻止这些信号吗?谢谢