信号和waitpid共存

时间:2013-10-04 15:03:17

标签: unix signals fork daemons waitpid

我有以下问题:我可以为SIGCHLD使用信号处理程序,在特定地方使用waitpid(3)吗?

这是我的场景:我启动一个监听套接字的守护进程(此时如果它是TCP或UNIX套接字则无关紧要)。每次客户端连接时,守护程序都会派一个子进程处理请求,父进程会继续接受传入的连接。处理请求的子进程需要在服务器上执行命令;让我们假设在我们的例子中它需要执行这样的副本:

cp -a /src/folder /dst/folder

为了做到这一点,clild分支一个新进程,它使用execl(3)(或execve(3)等)来执行复制命令。

为了更好地控制我的代码,理想情况下我希望用waitpid(3)捕获执行副本的子进程的退出状态。此外,由于我的守护进程正在让孩子们处理请求,我需要为SIGCHLD设置一个信号处理程序,以防止创建僵尸进程。

在我的代码中,我使用signal(3)为SIGCHLD设置了一个信号处理程序,我通过分叉两次守护我的程序,然后我在我的socket上侦听传入的连接,我分叉一个进程来处理每个即将到来的请求和我的孩子-process分叉一个grand-child-process来执行拷贝,试图通过waitpid(3)捕获它的退出状态。

当一个grand-child-process死掉,在waitpid(3)执行操作并且waitpid(3)返回-1之前,即使grand-child-process退出并且成功退出,SIGCHLD会被我的处理程序捕获。 / p>

我的第一个想法是添加:

signal(SIGCHLD, SIG_DFL);

就在分配子进程来处理我的连接客户端之前,没有任何成功。使用SIG_IGN也不起作用。

是否有关于如何使我的方案有效的建议?

提前感谢大家的帮助!

PS。如果你需要代码,我会发布它,但由于它的大小,我决定只在必要时这样做。

PS2。我的目的是在FreeBSD中使用我的代码,但我的检查是在Linux中执行的。

编辑[求助]:

我面临的问题已经解决了。 “意外”行为是由我的waitpid(3)处理代码引起的,该代码在某些时候是错误的。

因此,上述方法确实可以用于允许信号(3)和waitpid(3)在类似守护程序的程序中共存。

Thanx的帮助,我希望这种方法可以帮助那些希望完成这一事情的人!

0 个答案:

没有答案