возвращаемое значение в системном вызове vfork () - PullRequest
6 голосов
/ 19 февраля 2012

Учитывая приведенный ниже код:

int main()
{
  int pid;
  pid=vfork();
  if(pid==0)
     printf("child\n");
  else
     printf("parent\n");
  return 0;
  }

В случае vfork () адресное пространство, используемое родительским процессом и дочерним процессом, одинаково, поэтому единственная копия переменной pid должна бытьтам.Теперь я не могу понять, как эта переменная pid может иметь два значения, возвращаемые vfork () то есть ноль для дочернего элемента и ненулевое значение для родительского?

В случае fork () адресное пространство также копируется, и в каждом дочернем и родительском объекте есть две копии переменной pid, поэтому я могу понять, что в этом случае две разные копии могут иметь разные значения, возвращаемые fork () , но не могутпонять в случае vfork () , как pid имеет два значения, возвращаемые vfork () ?

1 Ответ

6 голосов
/ 19 февраля 2012

Нет 2 копий.Когда вы набираете vfork, родитель останавливается, пока ребенок делает свое дело (пока не вызовет _exit(2) или execve(2)).Таким образом, в любой момент существует только одна pid переменная.

В качестве примечания, то, что вы делаете, небезопасно. Стандарт говорит об этом ясно:

Функция vfork () должна быть эквивалентна fork (), за исключением того, что поведение не определено , если процесс созданvfork () либо изменяет любые данные, кроме переменной типа pid_t, используемой для хранения возвращаемого значения из vfork (), либо возвращает функцию, в которой был вызван vfork (), либо вызывает любую другую функцию перед успешным вызовом _exit () или одной из функций семейства exec.

Как примечание второй стороны, vfork был удален из SUSv4 - нет смысла его использовать.

...