You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:51:22