POSIX信号行为

7
如果一个进程因为SIGTRAP信号而被停止,然后通过kill()发送了一个SIGSTOP信号,那么默认的行为是什么?SIGSTOP会成为一个待处理信号,在进程再次运行时被传递吗?还是会被丢弃/忽略?
如果SIGSTOP排队了,是否有任何方法可以从该进程外部(如在跟踪进程中)将其从队列中删除?

2个回答

3

来自信号(signal)手册页面(signal(7)):

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

一个简单的测试,使用断点停止应用并向其发送SIGSTOP,当我按下“next”时,gdb会显示一些信息。显然信号已经被传递到了应用程序。在我发送SIGCONT之前,它不能继续被调试。

(gdb) next
Program received signal SIGSTOP, Stopped (signal).
fill (arr=0x7fffffffdff0, size=5) at tmp.cpp:28
(gdb) next
Program received signal SIGCONT, Continued.
fill (arr=0x7fffffffdff0, size=5) at tmp.cpp:28
(gdb) next
(gdb) 

0
你说的“因为SIGTRAP信号而停止”是什么意思?SIGTRAP不会停止一个进程;默认情况下,它将以核心转储的方式终止,或者您可以将其更改为忽略该信号或调用信号处理程序,但在任何情况下,SIGTRAP都不会单独停止进程。您可能正在使用ptrace(2)跟踪某个其他进程(例如调试器)的进程,在这种情况下,它将在传递SIGTRAP之前停止,但在这种情况下,它受到ptrace的控制,并且在进行PTRACE_CONT或其他ptrace操作以继续进程之前不会继续。

我正在追踪另一个进程并充当调试器,因此当该进程触发断点时,它将收到SIGTRAP信号并停止运行。所以我想知道,如果该进程已经停止并且已经接收到了SIGTRAP信号,那么如果随后发送SIGSTOP信号给该进程会发生什么?它会被挂起还是会被丢弃,因为该进程已经停止了? - ayelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接