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

6 投票
2 回答
21816 浏览
提问于 2025-04-18 11:55

我刚开始学习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()

根据我的理解,这段代码应该先调用父进程,并显示它的进程ID(PID)。然后,调用 os.fork(),这会创建一个父进程的副本。因为我们已经在父进程里,所以 newRef 变量应该是一个正数,而我代码中的 else 部分应该被执行。我的问题是:为什么代码在这之后会调用 child() 函数,虽然我代码的 if 部分不应该执行呢?

提前谢谢你们 :)

2 个回答

7

当你调用 os.fork 时,你会创建一个新的进程,这个新进程和原来的进程几乎一模一样,唯一的区别是:在原来的进程里,fork 会返回新进程的ID,而在新进程里,fork 会返回 0。这个返回值的不同就是让你可以在父进程和子进程中做不同的事情。

在你具体的代码中,子进程里 fork 的返回值是 0,所以子进程会调用 child 函数。而在父进程里,返回值不是 0,所以会执行 else 语句。

17

当你从 fork 返回时,实际上你现在有了 两个进程 在执行紧接着 fork 的代码。

所以你说的:

因为我们已经在父进程中

其实只对了一半。os.fork 返回后,父进程继续作为父进程执行代码,而子进程也在执行 完全相同的代码,它们的本地变量和全局变量都是一样的,唯一的不同是 fork 的返回值。所以,从子进程的角度来看,newRef 的值是 0,而从父进程的角度来看,newRef 的值是一个正数。两个进程会根据各自的情况继续执行代码。

撰写回答