возвращаемое значение в системном вызове vfork ()
-
27-10-2019 - |
Вопрос
Учитывая приведенный ниже код:
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
- Нет смысла использовать его.