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)