我正在开发一个将集成到客户端代码中的库(C).
这个lib会产生一些子进程,并且必须监视它们,一旦它们死掉就会重新生成它们(出于任何原因).
我需要使用vfork和exec来生成这些子进程.
我知道我必须使用信号处理程序来处理SIGCHLD并调用waitpid来检测哪个孩子死了.
但是,用户代码可能使用相同的想法来处理其自己的子进程.
如果我打电话给waitpid,我会检索有关任何可能死亡的儿童过程的信息(我或不是).
如果垂死的过程是我的,没问题……快乐的情况.
但是,如果它来自用户,他没有得到任何有关该信息的信息,因为我已经调用了waitpid.
我该如何解决这个问题?
我的第一个想法是使用进程组.
我第一次分叉时,我会得到子pid并将其保存为进程组ID.
我创建的每个孩子,我都会将它设置为这个pid.
你们认为这是一个不错的选择吗? (我遇到麻烦).
我的第二个想法是将信号处理程序重置为原始处理程序(或者只是调用它).
如果我重新加载信号,原始处理程序将能够获得它.
之后我必须重新安装我的信号处理程序.
这是一个不错的选择吗?
我的第三个选择是使用INFO(扩展信号处理程序).
我相信死亡过程的pid将在信息结构中提供.
如果这是我的一个孩子,我会给waitpid打电话,那没关系.
如果那不是我的,我会打电话给原始的信号处理程序.
这是一个不错的选择吗?
只是最后一个问题.
为了能够调用原始信号处理程序,我是否应该始终恢复它们并重新加载信号,或者只是将其称为函数调用就足够了?
非常感谢您的帮助.
最佳答案 另一个选择可能是首先生成一个子进程,它通过您喜欢的任何IPC机制与您的主进程通信.然后,从该新进程中生成多个子进程,这使您可以完全控制子进程终止的方式.