关于Python中的os.fork()函数

时间:2014-07-02 18:29:24

标签: python fork

我刚刚开始使用python,我开发了一个简单的程序来分叉父进程。这是我到目前为止编写的代码......

#!/usr/bin/env python
import os

def child():
    print "We are in the child process with PID= %d"%os.getpid()

def parent():
    print "We are in the parent process with PID= %d"%os.getpid()
    newRef=os.fork()
    if newRef==0:
        child()
    else:
        print "We are in the parent process and our child process has PID= %d"%newRef

parent()

据我所知,代码应该从调用父进程开始并显示其PID。然后,调用os.fork()并创建父进程的副本,由于我们已经在父进程中,newRef变量应该包含一个正值的值{{1}我的代码的一部分是应该执行的代码。我的问题是:为什么代码会在之后调用else函数,尽管代码的child()部分不应该执行。

提前致谢:)

2 个答案:

答案 0 :(得分:16)

fork返回后,您现在有两个进程紧跟fork后执行代码。

所以你的陈述:

  

因为我们已经在父进程中了

只是半真的。在os.fork返回后,父进程继续执行代码作为父进程,但子进程继续执行具有相同本地和全局变量的完全相同的代码,但返回值fork。因此,从子进程的角度来看,newRef的值为0,从父级的角度来看,newRef具有正值。这两个进程都会相应地执行代码。

答案 1 :(得分:7)

当您致电os.fork时,您创建的新流程是现有流程的完全副本,除了在原始流程中,fork返回流程ID新(子)进程,在新进程中,fork返回0。这种差异就是你如何在父母和孩子身上做出不同的事情。

在您的特定代码中,子级中fork的返回值为0,因此子进程会调用child函数。在父级中,返回值不是0,因此执行else子句。