2011-04-01 19 views
0

我在Managing Signal Handling for daemons that fork()中找到了答案,对我正在做的事情非常有帮助。我不知道如何解决Perl:在分支子代中安装信号处理程序,其执行者

“你会因此不需要安装任何的信号处理在execed进程启动时”

我没有在那个启动过程控制向上。有没有办法让我强制从叉子的父母那里得到exec的某些信号手柄?

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

system(<long-running cmd>); 

你会使用

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

我创建了一个<ID>锁定文件,不要让其他my_system(<ID>...)通过电话,如果有一个当前具有匹配ID运行。

上级分支/管理员<long-running cmd>并且在终止时清除锁定文件。我想让孩子自给自足,以便父母可以退出(或者如果父母得到kill -9,孩子可以自己照顾自己)。
}

回答

2

在Unix系统上,你可以让exec'd进程忽略信号(除非进程选择覆盖你说的话),但是你不能强迫它为它设置一个处理程序。你可以做的最多的是让相关信号由默认处理程序处理。

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

至于编程问题,有一个很好的理由,即锁文件通常包含持有锁的进程的进程ID(pid)它可以让你检查这个过程是否还在,即使它不是你的孩子。您可以从锁定文件中读取pid,然后使用kill(pid, 0),它会告诉您过程是否存在,您可以发送信号而不实际发送任何信号。

+0

很好的答案。我希望能有办法以某种方式将处理函数加载到正在运行的程序中......太糟糕了,这是不可能的。另外,lockfile的这个方案几乎可以随时为我的情况工作。唯一的问题是有很多计算机共享一个nfs文件系统。因此,如果从A启动了锁,则B无法查看它是否仍在运行,或者它是否是挂锁文件。 – ajwood 2011-04-02 14:30:27

1

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

第一个分支将创建一个子进程负责清理锁定文件,如果父母死亡。这个过程也将分叉孙子,这将执行长期运行的命令。

+0

这真的有帮助吗?你仍然可以'杀死'第一把叉子来解决问题。 – ajwood 2011-04-03 00:17:55