Как переменные распределяются между двумя процессами, когда участвует форк - PullRequest
6 голосов
/ 05 июля 2011
/*  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, создается новая копия процесса с его собственными переменными и собственным PID.Этот новый процесс запланирован независимо, и (в общем) выполняется почти независимо от процесса, который его создал.

Вопрос: Мне кажется, что переменная alarm_fired является общей для исходного процесса и новогосозданный процесс.

Это правильно?

Ответы [ 3 ]

7 голосов
/ 05 июля 2011

Нет. Каждый процесс получает свою собственную копию переменной (и почти все остальное). Если вы изменяете переменную в одном процессе, она изменяется только в этом процессе, а не в обоих. Каждый процесс имеет свое адресное пространство.

Сравните это с потоками, где все потоки совместно используют одно адресное пространство, поэтому изменение переменной в одном потоке будет видно во всех других потоках (внутри этого процесса).

Из Linux fork(2) manpage:

fork () создает дочерний процесс, который отличается от родительского процесса только своими PID и PPID и тем фактом, что использование ресурсов установлено на 0. Блокировки файлов и ожидающие сигналы не наследуются.

2 голосов
/ 05 июля 2011

Он разделяется в том смысле, что сразу после разветвления имеет одинаковое значение в обоих процессах. НО, когда кто-либо пишет в него, изменение не распространяется на другой процесс (то, что отличается.

Кроме того, см. копия при записи для интересных вещей.

EDIT

Кажется, что новый процесс создан изменил переменную alarm_fired который потом увидит старый Процесс

Ребенок посылает сигнал родителю. Затем родительский элемент выполняет обработчик, и лично устанавливает alarm_fired в единицу. Сам ребенок никогда не касается этой переменной.

1 голос
/ 05 июля 2011

Нет, переменные не являются общими для fork().В вашем коде дочерний процесс никогда не касается alarm_fired.То, что делает ребенок, это посылает сигнал родителю.Этот сигнал запускает обработчик сигнала в контексте родительского процесса, устанавливая переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...