加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 库的子进程的进程组

发布时间:2020-12-16 07:30:52 所属栏目:百科 来源:网络整理
导读:我正在开发一个将集成到客户端代码中的库(C). 这个lib会产生一些子进程,并且必须监视它们,一旦它们死掉就会重新生成它们(出于任何原因). 我需要使用vfork和exec来生成这些子进程. 我知道我必须使用信号处理程序来处理SIGCHLD并调用waitpid来检测哪个孩子死了
我正在开发一个将集成到客户端代码中的库(C).
这个lib会产生一些子进程,并且必须监视它们,一旦它们死掉就会重新生成它们(出于任何原因).
我需要使用vfork和exec来生成这些子进程.

我知道我必须使用信号处理程序来处理SIGCHLD并调用waitpid来检测哪个孩子死了.
但是,用户代码可能使用相同的想法来处理其自己的子进程.

如果我打电话给waitpid,我会检索有关任何可能死亡的儿童过程的信息(我或不是).
如果垂死的过程是我的,没问题……快乐的情况.
但是,如果它来自用户,他没有得到任何有关该信息的信息,因为我已经调用了waitpid.

我该如何解决这个问题?

我的第一个想法是使用进程组.
我第一次分叉时,我会得到子pid并将其保存为进程组ID.
我创建的每个孩子,我都会将它设置为这个pid.
你们认为这是一个不错的选择吗? (我遇到麻烦).

我的第二个想法是将信号处理程序重置为原始处理程序(或者只是调用它).
如果我重新加载信号,原始处理程序将能够获得它.
之后我必须重新安装我的信号处理程序.
这是一个不错的选择吗?

我的第三个选择是使用INFO(扩展信号处理程序).
我相信死亡过程的pid将在信息结构中提供.
如果这是我的一个孩子,我会给waitpid打电话,那没关系.
如果那不是我的,我会打电话给原始的信号处理程序.
这是一个不错的选择吗?

只是最后一个问题.
为了能够调用原始信号处理程序,我是否应该始终恢复它们并重新加载信号,或者只是将其称为函数调用就足够了?

非常感谢您的帮助.

解决方法

另一个选择可能是首先生成一个子进程,它通过您喜欢的任何IPC机制与您的主进程通信.然后,从该新进程中生成多个子进程,这使您可以完全控制子进程终止的方式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读