C 当进程调用sleep函数时,它是否发出信号?

C 当进程调用sleep函数时,它是否发出信号?,c,linux,signals,sleep,C,Linux,Signals,Sleep,我在程序中分叉一个进程,这个进程调用一个exec()函数,然后子进程调用sleep()函数 我想知道sleep()函数是否发送父级可以检测到的某种信号,如果是,它会发送什么类型的信号?通常sleep()是通过调用来实现的,该调用安排在超时过期后将SIGALRM信号发送到调用进程 换句话说,在sleep完成睡眠后,信号被发送,只是不发送到父进程,而是发送到名为sleep的进程。并且父进程不能截获传递给其子进程的信号。不,睡眠本身不向父进程发送任何类型的信号,它可以使用隐蔽的信号来唤醒自己,但这完全

我在程序中分叉一个进程,这个进程调用一个
exec()
函数,然后子进程调用
sleep()
函数

我想知道
sleep()
函数是否发送父级可以检测到的某种信号,如果是,它会发送什么类型的信号?

通常
sleep()
是通过调用来实现的,该调用安排在超时过期后将
SIGALRM
信号发送到调用进程


换句话说,在
sleep
完成睡眠后,信号被发送,只是不发送到父进程,而是发送到名为
sleep
的进程。并且父进程不能截获传递给其子进程的信号。

不,
睡眠本身不向父进程发送任何类型的信号,它可以使用隐蔽的信号来唤醒自己,但这完全是子进程内部的

如果你想通知父母,你必须在睡觉前亲自通知。这可能很简单:

#include <sys/types.h>
#include <unistd.h>
#include <sys/signal.h>
:
kill (getppid(), SIGHUP);
#包括
#包括
#包括
:
kill(getppid(),SIGHUP);

看看有两个相互矛盾的答案:它们都是POSIX的正确答案。允许
睡眠
使用
报警
,但这不是要求。可能是,也可能不是。(在Linux/glibc下没有,但这是巧合。此外,它仍然与
报警
交互,因为它可能会被
报警
调用的信号中断)。@Damon,我在回答中没有发现任何矛盾之处。两人都说睡眠可能会在隐蔽处使用信号,两人都说这与父母无关。如果有什么区别的话,它们是互补的。@paxdiablo:对我来说,似乎有人在并排阅读这两个词时会感到困惑,很容易将它们视为矛盾,因为它们实际上都是正确的(一个基本上说“不,它不是(好吧,好吧……它可能是内部的)”,另一个说“是的,它通常是……”。也许只是我。:-)这种实现绝不是典型的,甚至在现代多线程实现中都是无效的。POSIX的下一个问题(甚至可能是TC)将澄清这一点。@R..:从Linux:
sleep(3)
可以使用
SIGALRM
实现;混合调用
alarm()
sleep(3)
是个坏主意<代码>睡眠(3)
手册页也有完全相同的段落。在25年前的非Linux系统上。据我所见,现在Linux上的nanosleep系统调用主要是一个包装器。这段代码很活泼。父进程可能在
getppid
kill
之间终止,表示进程错误。@R,是的。父进程必须退出,另一个进程以完全相同的PID开始,这种情况几乎不太可能,但肯定是可能的。不幸的是,几乎任何解决方案都会有这个问题,你所能做的就是将其最小化。只有涉及信号的解决方案(几乎总是错误的解决方案)才会有这个问题。有很多与父进程通信的有效方法,如管道或共享内存。