C Fork、共享变量和;处理僵尸进程

C Fork、共享变量和;处理僵尸进程,c,fork,zombie-process,C,Fork,Zombie Process,我正在为一些家庭作业编写一个程序,这将需要一些分叉,但我对共享变量和处理僵尸进程有点不清楚 如果我有全局变量,那么父变量和所有子变量是否使用这些全局变量的相同“副本”?如果没有,我有什么方法可以让他们(vWork?) 我知道什么是僵尸进程,但我不清楚如何摆脱它们。我的程序将分离出许多临时进程,因此我不知道我可以分别为每个进程wait()。当父进程终止时,就会清除所有与其关联的僵尸,对吗?如果父母在孩子之前就被终止了呢?孩子完成后会留下一个僵尸吗(这些僵尸是定期清除的吗?init() 可能完全回避

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

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

  • 我知道什么是僵尸进程,但我不清楚如何摆脱它们。我的程序将分离出许多临时进程,因此我不知道我可以分别为每个进程
    wait()
    。当父进程终止时,就会清除所有与其关联的僵尸,对吗?如果父母在孩子之前就被终止了呢?孩子完成后会留下一个僵尸吗(这些僵尸是定期清除的吗?
    init()

  • 可能完全回避了问题2,因为我实际上并不关心子进程的结果,有没有办法让它们不留下僵尸?我看到了一些关于
    信号(SIGCHLD,SIG_IGN)
    的东西,但我不知道如何使用它,我发现它的主页有点迟钝

  • 1) 这两个进程不共享全局变量

    2) 使用
    waitid(2)
    可能会对您有所帮助。看,伙计

    如果父进程在子进程之前终止,则子进程将获得新的父进程—PID=1的进程,即
    init
    。如果孩子是僵尸,
    init
    会自动解决这个问题

    1) 如果我有全局变量,那么父变量和所有子变量是否使用这些全局变量的相同“副本”?如果没有,我有没有办法让他们(工作?)

    堆栈将被完全复制。复制,而不是共享。因此,如果你想让你的父母和孩子交流,你必须使用套接字或共享内存。或线程

    跳过问题2:

    3) 可能完全回避了问题2,因为我实际上并不关心子进程的结果,有没有办法让它们不留下僵尸?我看到了一些关于信号(SIGCHLD,SIG_IGN)的东西,但我不知道如何使用它,我找到的那个人有点。。。迟钝的

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

    SIGCHLD是当子进程终止时程序接收到的信号。默认情况下会忽略它。我们为什么不给自己写一个信号处理器呢?信号处理程序是一个void函数,其唯一参数为int:

    void cleanup_child(int signal) {
        wait();
    }
    
    现在,在主函数的最开始处注册信号处理程序,并完成以下操作:

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

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

    对于1)全局变量是共享的。这就是您需要在不同线程之间同步访问这些变量的地方。Forking创建了一个新的、独立的、独立的进程。也许你在想线程?@Mahesh在fork之后,所有全局变量(以及执行fork的函数中的局部变量)都是相同的,但它们不是共享的。父进程和子进程必须通过某种kine进行通信。@JoachimPileborg:mooo…-)1) 绝对不正确,;分叉进程不共享变量:每个进程都有自己的变量副本,不能读取另一个进程的值