你的问题对我来说有点不清楚,但我会提及一些我曾考虑过为类似情况做过的事情。
当您创建一个进程时,您可以暂时阻止SIGCHLD
并将子进程(以及如何处理它)的记录放入表中。
child_table_node_t * node = malloc(sizeof(child_table_node_t));
// err check that
child_table_node_init(node, type_of_child_stuff);
sigset_t old, set;
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_BLOCK, &set, &old);
pid_t pid = fork();
if (pid > 0) {
node->pid = pid;
add_to_table(alive_children, node);
sigprocmask(SIG_SETMASK, &old, NULL);
// other stuff
} else {
sigprocmask(SIG_SETMASK, &old, NULL);
if (!pid) {
// do child stuff
} else {
// do parent with no child stuff
}
}
你handle_sigchild
那么可以看一下儿谁在表芯(或停止或其他),并为他们做点什么。我建议将它们从alive_children
表中删除,并在信号处理程序中将它们放入dead_children
表中,以便应用程序可以更轻松地处理它们并释放其内存。如果你想跟上被停止和死亡的孩子,那么会有一点复杂的B/C,你不会希望从活着的表中删除它们。在非信号代码中遍历表可能更容易找到更改的节点。如果是这种情况,您可以在不添加或删除节点的情况下阻止信号。
然后,您的应用程序可以根据该过程的表节点中存储的数据执行特定于该子节点的操作。如果孩子在前台,那么它的死亡(或停止动作)就是将退出代码存储到退出代码变量中,并开始再次从终端或脚本获取命令。如果新去世的孩子是后台进程,那么您只需记录其退出代码并在下次打印命令提示符(如果处于交互模式)之前将其报告给终端。
正在做作业吗? – fortran 2010-05-21 10:22:27
设置“父亲”进程除了检查已终止的孩子之外什么也不做。从而减少了一个crach的可能性。你应该在cild过程中做所有的工作。 – eaanon01 2010-05-21 10:23:26