1)如果我有全局变量,父母和所有孩子是否使用这些全局变量的相同“副本”?如果没有,有什么方法可以让他们(vfork?)?
堆栈将被完全复制。复制的,不是共享的。因此,如果您希望您的父母和孩子进行通信,您必须使用套接字或共享内存。或线程。
跳过问题2:
3)可能完全回避问题2,因为我实际上并不关心子进程的结果,有没有办法让他们根本不留下僵尸?我看到了一些关于 signal(SIGCHLD, SIG_IGN) 的东西,但我不确定如何使用它,而且我发现的那个人有点……迟钝。
在 POSIX 中,您可以为程序使用特殊信号。例如 ctrl+c 将发送一个中断信号 (SIGINT),如果您没有定义 SIGINT 处理程序,它将终止您的程序。
SIGCHLD 是您的程序在子进程终止时收到的信号。默认情况下会被忽略。那么,我们为什么不自己编写一个小信号处理程序呢?信号处理程序是一个以 int 作为唯一参数的 void 函数:
void cleanup_child(int signal) {
wait();
}
现在在您的主要功能的最开始注册您的信号处理程序并完成:
int main(...){
signal(SIGCHLD,cleanup_child);
...
Now all zombies get cleaned automatically. Please keep in mind that a signal interrupts your current program, calls the specific signal handler and resumes your program.