【问题标题】:Is there a Python equivalent of vfork in Unix?Unix 中是否有与 vfork 等效的 Python?
【发布时间】:2019-03-23 17:47:46
【问题描述】:

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

【问题讨论】:

  • 在 Linux 上,Python 中的 fork 通常是写时复制。
  • vfork 的这种使用在 C 中已经是未定义的行为。

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


【解决方案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)

【讨论】:

  • 您对 vfork 的使用是未定义的行为;不允许修改子级中的 globvar 或 var 等变量。 >>> 但是程序是从APUE这本书中提取的?
  • @alan23273850:它来自书中,但它仍然是未定义的行为。连书都同意。引用这本书,“这种优化在 UNIX 系统的某些实现上更有效,但如果子修改任何数据(用于保存 vfork 返回值的变量除外)会导致未定义的结果......”
  • 好的,我明白了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2013-02-04
  • 2012-11-21
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多