大师,我有2个与Linuxfunction的问题:
睡觉
还是睡觉
如果我在这个过程中创build了多个线程,并且在线程中插入了睡眠函数,那么如果我将信号发送到进程中,睡眠是否会中断?
顺便说一句,如果我发送一个信号的进程,当进程得到的信号,将它发送到其子线程?
感谢您的答案
1:睡眠,因为我知道睡眠过程中会被任何发送信号的过程中断。 这样对吗?
它会被中断,除非特定的信号被忽略或使用sigprocmask
阻塞。
2:还在睡觉,如果我在这个过程中创建了几个线程,并且在线程中插入了睡眠函数,然后如果我发送信号进入进程,睡眠是否会中断?
只有一个线程接收到发送到该进程的信号,即使该进程中有多个线程解除了该信号。 请参阅Signal Concepts获取更多详细信息。 处理多线程程序中的信号的标准方法是在所有线程中阻塞所有信号,但处理信号的线程(通常是主线程)。
顺便说一句:如果我发送一个信号给进程,当进程得到信号,它会发送到它的子线程?
它不会。
但是,如果该过程是控制终端的会话组领导,则当会话首领终止时,其组将会收到SIGHUP
信号。 另外,当一个进程组成为孤立的时候,它的进程被发送SIGHUP
然后是一个SIGCONT
。
1:是的,没错。 如果在sleep()
之后检查errno
,它将被设置为EINTR
(中断)。
2:每个线程都可以使用pthread_sigmask()
来设置自己的信号掩码,如果阻塞了信号,它将不会被发送。 然而,如果不明确地阻止信号,则不确定哪个线程接收到信号。
但是,您可以使用pthread_kill()
将信号直接发送到特定的线程。
流程导向的信号被传递给进程的其中一个线程。 如果那个线程正在睡觉,它会被唤醒。
https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview
您只需要阅读“条件变量”部分。 它可以帮助你为你的目的得到pthread的概述。