Рабочая вилка () - PullRequest
       6

Рабочая вилка ()

3 голосов
/ 11 февраля 2012

Я недавно узнал о функции fork() в C. Так как эта функция создает два параллельных процесса, и эти два процесса совместно используют память.Итак, у меня есть следующий код:

#include<stdio.h>
int main()
{
  int pid,i;
  i=0;
  pid=fork();
  if(pid==0)
    {
      i++;
      printf("child process:: address of i:%u value of i:%d\n",(int)&i,i);
    }
  else if(pid>0)
    {
      wait(NULL);
      i--;
      printf("parent process:: address of i:%u value of i:%d\n",(int)&i,i);
    }

  return 0;
}

Вывод, который я получаю:

    child process:: address of i:3215563096 value of i:1
    parent process:: address of i:3215563096 value of i:-1

, но так как каждый раз, когда child выполняется первым, значение в ячейке памяти 3215563096 должно стать +1 для контраста 0 для родительского процесса.

Мой ожидаемый результат:

    child process:: address of i:3215563096 value of i:1
    parent process:: address of i:3215563096 value of i:0

Может кто-нибудь сказать мне, где я не прав?

Ответы [ 4 ]

5 голосов
/ 11 февраля 2012

Второй процесс использует ту же память, что и оригинал, при использовании fork ; однако память помечается как копируемая при записи, что означает, что как только дочерний элемент попытается изменить ее, управление памятью в ОС сделает копию страницы, поэтому исходный процесс не увидит измененную память. Подробнее на fork wiki .

3 голосов
/ 11 февраля 2012

У ребенка и родителя разные адресные пространства .Адреса виртуальной памяти (которые вы печатаете) совпадают .Но эти адреса относятся к разным областям физической памяти.

Это как два человека, живущих на " 1-я улица " в разных городах.

Преимущество этой схемы в том, что каждыйПроцесс имеет другое представление о памяти - защита и разделение памяти являются неотъемлемой частью.


Примечание: используйте при печати адресов %p вместо %u.

2 голосов
/ 11 февраля 2012

Когда вы выполняете fork (), дочерний процесс получает точную копию памяти родительского процесса. Они не разделяют память.

Адрес вашей переменной i одинаков, поскольку они ссылаются на разные адресные пространства - одно для родительского, другое для дочернего.

Возможно, вы думаете о нитях. Потоки разделяют память.

1 голос
/ 07 августа 2012

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

Все виртуальное адресное пространство родителя реплицируется в дочернем .

* 1006.* Это причина того, что printf () печатает один и тот же адрес, но физически они находятся в разных местах.

ПРИМЕЧАНИЕ

Помните, что когда мы используем адрес оператора (&), мы получаем только виртуальный адрес (который является относительным только по отношению к вашему процессу).Физическим адресом управляет только менеджер памяти вашей операционной системы (основная служба вашей операционной системы).

для получения дополнительной информации используйте команду в вашей оболочке linux

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