Сегменты дублируются во время fork ()? - PullRequest
1 голос
/ 27 ноября 2010

Я изучал, что во время разветвления сегмент данных и кода родительского процесса дублируется в дочерний процесс.

Пожалуйста, см. Программу ниже.

int main()
{
   int a = 5;
   pid_t pid;

   pid = fork();

   if(pid == 0)
   {
      printf("In child a = %d",a);
   }

   else
   {
     printf("In parent a = %d",a);
   }

   return 0;
}

Здесьнаходится в сегменте стека родительского процесса, как объявлено внутри функции, main().Дочерний процесс должен получать только копию кода и сегмент данных родительского процесса, а не стек во время fork().Но когда я запускаю программу, я вижу, что дочерний процесс может также получить доступ к переменной «a».Это означает, что каким-то образом стек родительского процесса также копируется в дочерний процесс.

Пожалуйста, сообщите мне причину этого и исправьте меня, если мое понимание неверно.

Ответы [ 2 ]

2 голосов
/ 27 ноября 2010

Это не очень хороший тест - как указал Мэтью, fork () дает вам точную копию родительского процесса, включая стек (иначе ребенок не сможет вернуться из этой функции).

Лучший тест состоит в том, чтобы изменить «a» в родительском элементе и наблюдать его в дочернем элементе, например:

#include <stdio.h>
#include <unistd.h>
int main()
{
    int a = 5;
    pid_t pid;

    pid = fork();

    if (pid == 0)
    {
        sleep(5);
        printf("In child a = %d\n",a);
    }
    else
    {
        a++;
        printf("In parent a = %d\n",a);
    }

    return 0;
}

и результат правильный:

pandora:~/tmp$ cc -o x x.c
pandora:~/tmp$ ./x
In parent a = 6
pandora:~/tmp$ In child a = 5
2 голосов
/ 27 ноября 2010

Вы должны проверить документы еще раз.fork создает «точную копию вызывающего процесса».Следует признать, что существует множество исключений, но стек не является одним из них.

Кроме того, если стек не дублировался, очень распространенная идиома (также используемая в вашем коде) проверки возвращаемого значения(почти всегда переменная стека) из fork потерпит неудачу. не будет позиция стека для pid, если только стек (включая указатель стека) не будет дублирован.

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