Unix中是否有与vfork等效的Python?

时间:2018-10-18 20:33:41

标签: python linux python-3.x python-2.7 unix

我正在阅读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()创建了一个子进程,而没有复制父进程所拥有的地址空间。父级将等到子进程调用退出或执行。 Python提供了类似的底层控制吗?如果可能,如何在Python中实现?

1 个答案:

答案 0 :(得分:1)

vforkfork的最过时的优化,仅用于紧随其后的exec的用途。它是在fork不使用写时复制的情况下设计的,并且通过写时复制几乎变得毫无意义。

您使用vfork是未定义的行为;不允许在子级中修改变量globvarvar。几乎唯一允许孩子做的事情就是调用exec*函数之一。详细信息在man page中。

如果您的目标是在Python进程之间共享内存,则应使用multiprocessing modulemultiprocessing.sharedctypes

如果您的目标是调用vfork,请继续使用ctypes进行调用,并观察程序立即崩溃,因为无法从Python安全地调用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)