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