【问题标题】:Fork, sharing variables, & handling zombie processes分叉、共享变量和处理僵尸进程
【发布时间】:2012-02-12 20:07:21
【问题描述】:

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

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

  2. 我知道什么是僵尸进程,但我不清楚如何摆脱它们。我的程序将分离出许多临时进程,所以我不知道我可以为每个进程单独wait()。当父进程终止时,它会清除与之相关的所有僵尸,对吗?如果父母在孩子之前终止怎么办?孩子完成后会留下僵尸吗(这些是init() 定期清除的)?

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

【问题讨论】:

  • 对于 1) 全局变量是共享的。您需要查看这些变量在各个线程之间的同步访问。
  • 分叉创建了一个新的、独立的、独立的流程。也许您在考虑线程?
  • @Mahesh 分叉后,所有全局变量(以及执行分叉的函数中的本地变量)都相同,但它们不共享。父进程和子进程必须通过 IPC 的某些 kine 进行通信。
  • @JoachimPileborg: Moooo.... :-)

标签: c fork zombie-process


【解决方案1】:

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

堆栈将被完全复制。复制的,不是共享的。因此,如果您希望您的父母和孩子进行通信,您必须使用套接字或共享内存。或线程。

跳过第2题:

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

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

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

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

现在在 main 函数的最开始注册您的信号处理程序并完成:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 1) 绝对不正确;分叉进程不共享变量:每个进程都有自己的变量副本,无法读取对方的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2016-07-03
    相关资源
    最近更新 更多