为何向Linux多线程进程发送SIGSTOP/SIGCONT会作用于所有线程?
void * threadFunc(void *args) { (void)args; long id = pthread_self(); while (1) { printf("Hello from %li\n", id); sleep(1); } return NULL; }
为什么SIGSTOP会让所有线程停止?
这是因为SIGSTOP属于进程级的作业控制信号,和你认知里的普通信号(比如SIGUSR1、SIGINT)逻辑完全不同:
- 普通信号(非作业控制类)确实会递送到进程内的某一个线程(具体选哪个线程,取决于线程的信号掩码、是否处于可接收信号的状态),但SIGSTOP、SIGCONT这类信号的作用对象是整个进程,而非单个线程。
- 按照POSIX标准和Linux内核的实现,当进程收到SIGSTOP时,内核会直接暂停该进程下的所有线程的执行,将整个进程标记为停止状态——这个操作是原子性的,没有办法只停单个线程。
- 而且这类作业控制信号是无法被捕获、忽略或者阻塞的,不管你的线程设置了什么样的信号掩码,只要进程收到SIGSTOP,所有线程都会立刻暂停,直到收到SIGCONT信号,内核才会恢复整个进程的所有线程的执行。
简单说,SIGSTOP不是给单个线程发的信号,是给整个进程“按下暂停键”的命令,自然所有线程都会停。
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

