我有以下问题:我可以为 SIGCHLD 使用信号处理程序并在特定位置使用 waitpid(3) 吗?
这是我的场景:我启动一个监听套接字的守护进程(此时它是 TCP 还是 UNIX 套接字无关紧要)。每次客户端连接时,守护进程都会派生一个子进程来处理请求,并且父进程继续接受传入的连接。处理请求的孩子有时需要在服务器上执行命令;让我们假设在我们的示例中它需要执行这样的复制:
cp -a /src/folder /dst/folder
为此,clild 派生了一个新进程,该进程使用 execl(3)(或 execve(3) 等)来执行复制命令。
为了更好地控制我的代码,理想情况下,我希望使用 waitpid(3) 捕获执行副本的孩子的退出状态。此外,由于我的守护进程正在派生子进程来处理请求,因此我需要为 SIGCHLD 提供信号处理程序,以防止创建僵尸进程。
在我的代码中,我使用信号(3)为 SIGCHLD 设置了一个信号处理程序,我通过分叉两次来守护我的程序,然后我在我的套接字上监听传入的连接,我分叉一个进程来处理每个即将到来的请求和我的子进程分叉一个执行复制的子进程,试图通过 waitpid(3) 捕获其退出状态。
发生的情况是,当孙子进程死亡时,SIGCHLD 被我的处理程序捕获,在 waitpid(3) 采取行动并且 waitpid(3) 返回 -1 之前,即使孙子进程成功退出。
我的第一个想法是添加:
signal(SIGCHLD, SIG_DFL);
就在分叉子进程来处理我的连接客户端之前,没有任何成功。使用 SIG_IGN 也不起作用。
有没有关于如何使我的场景工作的建议?
提前感谢大家的帮助!
PS。如果您需要代码,我会发布它,但由于它的大小,我决定仅在必要时这样做。
PS2。我的意图是在 FreeBSD 中使用我的代码,但我的检查是在 Linux 中执行的。
编辑[已解决]:
我面临的问题解决了。“意外”行为是由我的 waitpid(3) 处理代码引起的,该代码在某些时候有问题。
因此,上述方法确实可以用于在类似守护程序的程序中允许 signal(3) 和 waitpid(3) 共存。
感谢您的帮助,我希望这种方法可以帮助希望完成这样事情的人!