Тип возврата vfork()

Из руководства GNU:

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

Что это значит? Означает ли это, что возвращаемое значение vfork() не может быть присвоено переменной типа, отличной от pid_t?


person SysCW    schedule 29.05.2020    source источник


Ответы (1)


Руководство довольно запутанно по этому поводу. На самом деле оба процесса (дочерний и родительский) использовали одно и то же адресное пространство, даже стек!

vfork() возвращается дважды:

  1. В дочернем процессе возвращается 0
  2. Когда дочерний процесс завершается или выполняется какая-либо другая программа, второй возврат выполняется в родительском процессе с идентификатором дочернего процесса. Тем временем процесс отца был приостановлен.

Код возврата fork()/vfork() обычно хранится в переменной (типа pid_t, чтобы следовать синопсису системных вызовов):

pid_t pid = vfork();

Поскольку адресное пространство совместно используется отцом и дочерним процессом, когда мы запускаем vfork(), одна и та же переменная изменяется и в отце, и в дочернем процессе! Но в дочернем процессе ей последовательно присваивается значение 0 и после того, как последний либо выходит, либо выполняет программу, переменная устанавливается во второй раз, но с pid дочернего процесса в родительском процессе.

Примечание: в руководстве говорится :

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

person Rachid K.    schedule 05.11.2020