我正在开发一个将集成到客户端代码中的库(C++)。该库将产生一些子进程,并且必须监视它们以在它们死后立即重新生成它们(出于任何原因)。我需要使用 vfork 和 exec 来生成这些子进程。
我知道我必须使用信号处理程序来处理 SIGCHLD 并调用 waitpid 来检测哪个孩子已经死了。但是,用户代码可能使用相同的想法来处理自己的子进程。
如果我调用 waitpid,我将检索有关任何可能死亡的子进程的信息(我的或不是我的)。如果死亡过程是我的,没问题……幸福的情况。但是,如果是来自用户,他不会得到任何相关信息,因为我已经调用了 waitpid。
我该如何解决这个问题?
我的第一个想法是使用进程组。第一次分叉时,我会获取子 pid 并将其保存为进程组 ID。我创建的每个孩子,我都会将它的组设置为这个pid。大家觉得这样的选择好不好?(我遇到了麻烦)。
我的第二个想法是将信号处理程序重置为原始处理程序(或直接调用它)。如果我重新发出信号,原始处理程序将能够得到它。之后我必须重新安装我的信号处理程序。会是一个不错的选择吗?
我的第三个选择是使用 INFO(扩展信号处理程序)。我相信消亡过程的pid将在信息结构中可用。如果这是我的一个孩子,我会为此打电话给waitpid,没关系。如果那不是我的,我会调用原始信号处理程序。会是一个不错的选择吗?
最后一个问题。为了能够调用原始信号处理程序,我应该始终恢复它们并重新发出信号还是仅将其作为函数调用来调用就足够了?
非常感谢您的帮助。