关于Python中的os.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()
根据我的理解,这段代码应该先调用父进程,并显示它的进程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
的值是一个正数。两个进程会根据各自的情况继续执行代码。