Есть ли Python-эквивалент vfork в Unix? - PullRequest
0 голосов
/ 18 октября 2018

Я читаю APUE.

#include "apue.h"
int     globvar = 6;        /* external variable in initialized data */
int main(void)
{
    int     var;        /* automatic variable on the stack */
    pid_t   pid;
    var = 88;
    printf("before vfork\n");   /* we don′t flush stdio */
    if ((pid = vfork()) < 0) {
        err_sys("vfork error");
    } else if (pid == 0) {      /* child */
        globvar++;              /* modify parent′s variables */
        var++;
        _exit(0);               /* child terminates */
    }
   /* parent continues here */
   printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);
   exit()

}

Говорят, что vfork () создает дочерний процесс, не копируя адресное пространство родительского процесса.И родитель будет ждать, пока дочерний процесс не вызовет exit или exec.Есть ли что-то похожее в Python для такого низкого уровня контроля?Как это может быть достигнуто в Python, если это возможно?

1 Ответ

0 голосов
/ 19 октября 2018

vfork - это в основном устаревшая оптимизация fork, предназначенная исключительно для тех случаев, когда за ней сразу следует exec.Он был разработан тогда, когда fork не использовал копирование при записи, и был практически полностью бессмысленным при копировании при записи.

Использование vfork - неопределенное поведение;изменение переменных типа globvar или var в дочернем элементе не допускается.Почти единственное, что разрешено делать ребенку, - это вызвать одну из exec* функций.Подробности в справочной странице .

Если ваша цель - разделить память между процессами Python, вы должны сделать это с помощью multiprocessing модуля и multiprocessing.sharedctypes.

Если ваша цель - позвонить по номеру vfork, продолжайте звонить по номеру ctypes и наблюдайте, как ваша программа сразу разваливается, поскольку невозможно безопасно вызвать vforkс питона:

$ cat asdf.py
import ctypes
import os

lib = ctypes.CDLL('libc.so.6')
vfork = lib.vfork

if not vfork():
    os.execv('/usr/bin/echo', ['echo', 'hello', 'world'])

print("Should print in parent, but doesn't due to memory corruption.")
$ python3.6 asdf.py
hello world
Segmentation fault (core dumped)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...