gpt4 book ai didi

python - Python 中是否有相当于 Unix 中 vfork 的工具?

转载 作者:太空宇宙 更新时间:2023-11-04 04:43:31 25 4
gpt4 key购买 nike

我正在阅读 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中实现这一点?

最佳答案

vfork 是对 fork 的一种几乎已过时的优化,仅适用于紧随其后的 exec 的使用。它是在 fork 没有使用写时复制时设计的,并且通过写时复制几乎完全变得毫无意义。

您对 vfork 的使用是未定义的行为;不允许在子级中修改诸如 globvarvar 之类的变量。几乎允许子进程做的唯一一件事就是调用 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)

关于python - Python 中是否有相当于 Unix 中 vfork 的工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52882129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com