【发布时间】:2019-04-18 12:50:15
【问题描述】:
我正在编写代码分叉(3、5、... 不定数)。我希望我的程序在指定的时间后结束(父母首先杀死它的孩子,然后可能通过调用 _exit 来杀死自己,这也是 sig-safe)。我的意思是在信号处理程序中,我通过 kill() 杀死所有孩子,然后为所有孩子调用 waitpid(),因为两者都是异步信号安全函数。为此,我在分叉之前使用setitimer(ITIMER_REAL, &timer, NULL。
那么它是由分叉的孩子继承的吗?
如果它不是继承的,你能提供一个来源吗?
如果是继承的,是否所有的孩子都会在这段时间结束后结束?另外,其实我不想要这个案子。
【问题讨论】:
-
@JonathanLeffler 先生,在时间完全过去后,主进程(父进程)通过调用 SIGKILL 杀死它的子进程,因为它们只要它们还活着就服务(接受请求)。在通过一个循环向它们所有人发送 SIGKILL 后,父级再次运行另一个循环以等待它们实际清理进程表资源等。
-
我怀疑您的意思是“使用 SIGKILL 调用
kill()”而不是“调用 SIGKILL”,因为 SIGKILL 不是可以调用的函数。谨慎使用 SIGKILL;它阻止进程执行任何清理代码。考虑将 SIGHUP 或 SIGTERM 发送给子进程,然后等待它们清理,只向任何没有足够快死的顽固的子进程发送 SIGKILL 可能是明智的。 -
@JonathanLeffler 首先,我的意思是用 SIGKILL 调用 kill()。你的意思是通过调用 SIGHUP 或 SIGTERM 而不是 SIGKILL 我应该处理你提到的信号之一,这样如果我分配了一些带有 malloc 的地方,我就可以进行清理。那么,您能否扩展您的意思,对任何死得不够快的顽固儿童也说 SIGKILL?
-
@JonathanLeffler 还说清理是指关闭文件描述符吗?还是应该做更多的事情?如果是,我应该怎么做?
标签: c linux timer fork setitimer