首页 > 解决方案 > 捕获 SIGCHLD 并替换终止的孩子

问题描述

我正在分叉 n 个孩子并将每个孩子的 pid_t 保存在动态分配的表中(是的,我想这样做,因为我需要父进程拥有这些 id)。我的程序应该期待一个 SIGCHLD 信号,当它收到它时,它必须替换终止的子进程。所以,现在我必须用 pid_t 改变 child 的数组索引,并用一个新的 fork 替换它。

我的问题是,我怎么能真正做这样的事情,因为处理程序将被称为我的主程序“外部”,并且无法访问我的 pid 表。也许使表全局化并且只为父级初始化它?或者处理程序可以与 main 交互并以某种方式传递被释放和替换的 pid 值?

我可能会问,我是否应该首先创建这样一个表。我应该只使用 fork 的返回值而不是 parent 的表吗?在这种情况下,我将不得不创建一个if语句来检查每个 pid=fork() 而不是只有一个if语句将只输入 parentid 并且对于表中每个孩子的 id 都有一个循环。

编辑:我看不出我的代码有什么帮助,因为我想我解释了这个过程,但我描述的是。

signal(SIGCHLD,handler)
pid_t table[n];
for(int i=0;i<n;i++){
    pid_t pid;
    if((pid=fork())!=0){
        table[i]=pid;
    }
}

void handler(int num){
    //what do i do here?
}

标签: cforkhandlersigchld

解决方案


推荐阅读