在涉及fork时,如何在两个进程之间共享变量

时间:2011-07-05 17:50:07

标签: c linux fork

/*  In alarm.c, the first function, ding, simulates an alarm clock.  */

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

static int alarm_fired = 0;

void ding(int sig)
{
    alarm_fired = 1;
}

/*  In main, we tell the child process to wait for five seconds
    before sending a SIGALRM signal to its parent.  */

int main()
{
    pid_t pid;

    printf("alarm application starting\n");

    pid = fork();
    switch(pid) {
    case -1:
      /* Failure */
      perror("fork failed");
      exit(1);
    case 0:
      /* child */
        sleep(5);
        printf("getppid: %d\n", getppid());
        kill(getppid(), SIGALRM);
        exit(0);
    }

/*  The parent process arranges to catch SIGALRM with a call to signal
    and then waits for the inevitable.  */

    printf("waiting for alarm to go off\n");
    (void) signal(SIGALRM, ding);

    printf("pid: %d\n", getpid());
    pause();
    if (alarm_fired)
        printf("Ding!\n");

    printf("done\n");
    exit(0);
}

I have run the above code under Ubuntu 10.04 LTS

> user@ubuntu:~/Documents/./alarm
> alarm application starting
> waiting for alarm to go off
> pid: 3055
> getppid: 3055
> Ding!
> done

我从一本书中读到了以下陈述。

  

明确这一点非常重要   fork系统之间的区别   调用和创建新线程。   当进程执行fork调用时,a   创建了该过程的新副本   有自己的变量和自己的变量   PID。这个新流程已经安排好了   独立地,(一般地)   几乎独立于执行   创建它的过程。

问题: 在我看来,变量alarm_fired在原始进程和新创建的进程之间共享。

这是对的吗?

3 个答案:

答案 0 :(得分:7)

没有。每个进程都有自己的变量副本(以及其他所有变量)。如果在一个进程中更改变量,则仅在该进程中更改它,而不是在两个进程中都更改。每个进程都有自己的地址空间。

将它与线程进行比较,其中所有线程共享一个地址空间,因此一个线程中变量的变化将在所有其他线程中可见(在该过程中)。

来自Linux fork(2)联机帮助页:

  

fork()创建一个子进程,该进程与父进程的PID和PPID不同,并且资源利用率设置为0.文件锁和挂起信号不会被继承。

答案 1 :(得分:2)

它在fork之后立即共享,它在两个进程中具有相同的值。但是当写入它时,更改不会传播到另一个进程(那是不同的。

另外,请参阅copy on write了解有趣的内容。

修改

  

似乎是新创建的流程   修改了变量alarm_fired   然后由老人看到   过程

孩子向父母发送信号。然后父母执行处理程序,个人alarm_fired设置为一个。孩子本身从不触及那个变量。

答案 2 :(得分:1)

不,变量不会在fork()之间共享。在您的代码中,子进程从不触及alarm_fired。孩子做的是向父母发送信号。该信号在父进程的上下文中触发信号处理程序,设置变量。