一个进程的信号如何影响其子线程?

大师,我有2个与Linuxfunction的问题:

  1. 睡觉

    据我所知,睡眠中的任何信号都会被其发送过程中断。 这是正确的吗?

  2. 还是睡觉

    如果我在这个过程中创build了多个线程,并且在线程中插入了睡眠函数,那么如果我将信号发送到进程中,睡眠是否会中断?

顺便说一句,如果我发送一个信号的进程,当进程得到的信号,将它发送到其子线程?

感谢您的答案

1:睡眠,因为我知道睡眠过程中会被任何发送信号的过程中断。 这样对吗?

它会被中断,除非特定的信号被忽略或使用sigprocmask阻塞。

2:还在睡觉,如果我在这个过程中创建了几个线程,并且在线程中插入了睡眠函数,然后如果我发送信号进入进程,睡眠是否会中断?

只有一个线程接收到发送到该进程的信号,即使该进程中有多个线程解除了该信号。 请参阅Signal Concepts获取更多详细信息。 处理多线程程序中的信号的标准方法是在所有线程中阻塞所有信号,但处理信号的线程(通常是主线程)。

顺便说一句:如果我发送一个信号给进程,当进程得到信号,它会发送到它的子线程?

它不会。

但是,如果该过程是控制终端的会话组领导,则当会话首领终止时,其组将会收到SIGHUP信号。 另外,当一个进程组成为孤立的时候,它的进程被发送SIGHUP然后是一个SIGCONT

1:是的,没错。 如果在sleep()之后检查errno ,它将被设置为EINTR (中断)。

2:每个线程都可以使用pthread_sigmask()来设置自己的信号掩码,如果阻塞了信号,它将不会被发送。 然而,如果不明确地阻止信号,则不确定哪个线程接收到信号。

但是,您可以使用pthread_kill()将信号直接发送到特定的线程。

流程导向的信号被传递给进程的其中一个线程。 如果那个线程正在睡觉,它会被唤醒。

  1. 你应该使用条件等待,而不是睡眠。

https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview

您只需要阅读“条件变量”部分。 它可以帮助你为你的目的得到pthread的概述。