0

我在为 fork() 的守护进程管理信号处理中找到了答案,这对我正在做的事情非常有帮助。我不确定如何解决

“因此,您需要在启动时在执行的进程中安装任何信号处理”

我无法控制启动的过程。我有什么办法可以exec从 fork 的父级强制 ed 上的一些信号句柄?

编辑: {
我正在编写一个监视长时间运行进程的 Perl 模块。代替

system(<long-running cmd>);

你会用

my_system(<ID>, <long-running cmd>);

我为该文件创建了一个锁定文件,并且如果当前正在运行具有匹配 ID 的呼叫,<ID>则不要让另一个呼叫通过。my_system(<ID>...)

父 fork/execs<long-running cmd>并在终止时清理锁定文件。我想让孩子自给自足,这样父母就可以退出(或者如果父母得到 a ,孩子可以自己照顾自己kill -9)。
}

4

2 回答 2

2

在 Unix 系统上,您可以使 exec'd 进程忽略信号(除非该进程选择覆盖您所说的内容),但您不能强制它为其设置处理程序。你能做的最多就是让相关信号由默认处理程序处理。

如果你仔细想想,你就会明白为什么。要安装信号处理程序,您必须提供一个函数指针 - 但执行该函数的进程exec()无法指定其函数之一,因为它们不会作为 exec 进程的一部分存在,并且它不能指定一个的 exec'd 进程函数,因为它们不作为 exec'ing 进程的一部分存在。同样,您不能atexit()在 exec'ing 进程中注册将由 exec'd 进程支持的处理程序。

至于您的编程问题,锁文件通常包含持有锁的进程的进程 ID(pid)是有充分理由的;它允许您检查该过程是否仍然存在,即使它不是您的孩子。您可以从锁定文件中读取 pid,然后使用kill(pid, 0)which 将告诉您该进程是否存在,您可以在不实际发送任何信号的情况下向它发出信号。

于 2011-04-02T00:43:41.740 回答
1

一种方法是使用两个分叉。

如果父进程死亡,第一个分叉将创建一个子进程负责清理锁定文件。此过程还将派生一个孙子,它将执行长时间运行的命令。

于 2011-04-01T23:51:00.373 回答