我有以下问题:我可以为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的帮助,我希望这种方法可以帮助那些希望完成这一事情的人!