Obl*_*age 2 c fork zombie-process
我正在为一些需要分叉的作业编写程序,但我对共享变量和处理僵尸进程有点不清楚。
如果我有全局变量,父级和所有子级是否使用这些全局变量的相同“副本”?如果没有,有什么方法可以让他们(vfork?)?
我知道僵尸进程是什么,但我不清楚如何摆脱它们。我的程序将分拆出许多临时进程,所以我不知道我可以wait()单独处理它们中的每一个。当父进程终止时,它会摆脱所有与之相关的僵尸,对吗?如果父级在子级之前终止怎么办?完成后孩子会留下僵尸init()吗(这些僵尸会定期清除吗)?
可能完全回避问题 2,因为我实际上并不关心子进程的结果,有没有办法让它们根本不留下僵尸?我看到了一些关于signal(SIGCHLD, SIG_IGN)但我不确定如何使用它的内容,而且我发现它的联机帮助页有点迟钝。
1)如果我有全局变量,父级和所有子级是否使用这些全局变量的相同“副本”?如果没有,有什么方法可以让他们(vfork?)?
堆栈将被完全复制。抄袭,不分享。因此,如果您希望父母和孩子进行通信,则必须使用套接字或共享内存。或线程。
跳过问题2:
3)可能完全回避问题2,因为我实际上并不关心子进程的结果,有没有办法让它们根本不留下僵尸?我看到了一些关于信号(SIGCHLD,SIG_IGN)的东西,但我不知道如何使用它,我找到的那个人有点......迟钝。
在 POSIX 中,您可以为您的程序使用特殊信号。例如 ctrl+c 将发送一个中断信号 (SIGINT),如果您没有定义 SIGINT 处理程序,它将终止您的程序。
SIGCHLD 是您的程序在子进程终止时收到的信号。默认情况下会忽略它。那么,我们为什么不给自己写一个小信号处理程序呢?信号处理程序是一个以 int 作为唯一参数的 void 函数:
void cleanup_child(int signal) {
wait();
}
Run Code Online (Sandbox Code Playgroud)
现在在你的主函数的最开始注册你的信号处理程序并完成:
int main(...){
signal(SIGCHLD,cleanup_child);
...
Run Code Online (Sandbox Code Playgroud)
现在所有僵尸都会自动清理。请记住,信号会中断您当前的程序,调用特定的信号处理程序并恢复您的程序。