Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top