системный вызов vfork () - PullRequest
5 голосов
/ 20 мая 2011

Я прочитал, что новый процесс, созданный с помощью системного вызова vfork (), выполняется как поток в адресном пространстве родителя, и пока дочерний поток не вызывает системные вызовы exit () или exec (), родительский поток блокируется.Поэтому я написал программу, используя системный вызов vfork ()

#include <stdio.h>  
#include <unistd.h>

int main()  
 {  
      pid_t pid;  
      printf("Parent\n");  
      pid = vfork();  
      if(pid==0)  
      {  
          printf("Child\n");  
      }  
      return 0;  
  }

. Получил следующий вывод:

 Parent  
 Child  
 Parent  
 Child  
 Parent  
 Child  
 ....  
 ....  
 ....

Я предполагал, что оператор return должен вызывать exit ()системный вызов внутри, поэтому я ожидал, что результат будет только

Parent  
Child

Может кто-нибудь объяснить мне, почему на самом деле он не останавливается и непрерывно печатает бесконечный цикл.

1 Ответ

5 голосов
/ 20 мая 2011

Вы должны внимательно прочитать справочную страницу для vfork:

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

(выше взято из части справочной страницы по POSIX, поэтому применяется (потенциально) к другим средам, кроме Linux).

Вы звоните printf и возвращаетесь от ребенка, поэтому поведение вашей программы не определено.

...