为什么当你停止一个进程然后尝试用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
$
答案 0 :(得分:1)
SIGKILL
。 SIGUSR1
和SIGINT
可以。