gpt4 book ai didi

c - fork 、共享变量和处理僵尸进程

转载 作者:行者123 更新时间:2023-12-02 01:17:43 26 4
gpt4 key购买 nike

我正在为一些需要 fork 的家庭作业编写程序,但我对共享变量和处理僵尸进程有点不清楚。

  1. 如果我有全局变量,父项和所有子项是否使用这些全局变量的相同“副本”?如果没有,我有什么方法可以让他们到达 (vfork?)?

  2. 我知道僵尸进程是什么,但我不清楚如何摆脱它们。我的程序将分拆出许多临时进程,所以我不知道我是否可以为每个进程单独 wait()。当父进程终止时,所有与之关联的僵尸进程都会被清除,对吧?如果 parent 先于 child 终止怎么办? child 完成后会留下一个僵尸吗(这些是 init() 定期清除的僵尸)?

  3. 可能完全回避了问题 2,因为我实际上并不关心子进程的结果,有没有办法让它们完全不留下僵尸?我看到了一些关于 signal(SIGCHLD, SIG_IGN) 的内容,但我不确定如何使用它,而且我发现它的联机帮助页有些晦涩难懂。

最佳答案

1) If I have global variables, do the parent and all children work with the same "copy" of those global variables? If not, is there some way I can get them to (vfork?)?

堆栈将被完整复制。复制,不分享。因此,如果您希望您的 parent 和 child 进行通信,您必须使用套接字或共享内存。或线程。

跳过问题2:

3) Possibly sidestepping question 2 entirely, since I don't actually care about the results from the child processes, is there any way to have them not leave behind zombies at all? I saw something about signal(SIGCHLD, SIG_IGN) but I'm not sure how to use it, and the man for it I found was somewhat... obtuse.

在 POSIX 中,您可以为您的程序使用特殊信号。例如,ctrl+c 将发送一个中断信号 (SIGINT),如果您没有定义 SIGINT 处理程序,它将终止您的程序。

SIGCHLD 是您的程序在子进程终止时收到的信号。它默认被忽略。那么,我们为什么不自己编写一个小信号处理程序呢?信号处理程序是一个带有 int 作为唯一参数的 void 函数:

void cleanup_child(int signal) {
wait();
}

现在在您的主要功能的最开始注册您的信号处理程序并完成:

int main(...){
signal(SIGCHLD,cleanup_child);
...

现在所有僵尸都会自动清理。请记住,信号会中断您当前的程序,调用特定的信号处理程序并恢复您的程序。

关于c - fork 、共享变量和处理僵尸进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9252245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com