我正在阅读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中实现?
答案 0 :(得分:1)
vfork
是fork
的最过时的优化,仅用于紧随其后的exec
的用途。它是在fork
不使用写时复制的情况下设计的,并且通过写时复制几乎变得毫无意义。
您使用vfork
是未定义的行为;不允许在子级中修改变量globvar
或var
。几乎唯一允许孩子做的事情就是调用exec*
函数之一。详细信息在man page中。
如果您的目标是在Python进程之间共享内存,则应使用multiprocessing
module和multiprocessing.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)