Python 大法好 OS.fork()
大家都知道 fork()吧, 他是Linux和Unix系统上提供的一种系统调用(windows 上面没有这个东西, 所以…), 普通的函数调用, 调用一次, 会返回一次, 而 fork()调用一次, 会返回两次, 因为系统在调用此函数的时候, 会把当前进程也就是父进程复制一份为’子进程’, 然后分别在父子进程之中返回, 而且会先执行父进程.
子进程会永远地返回0, 而父进程会把子进程的 pid 作为返回值返回. 在这里, 只要稍加判断返回值是否为零, 就可以知道当前执行在父进程还是子进程了. 而需要知道的是 pid 是一个大于零的整数唯一进程表示数值, 当返回的值小于零的时候, 我们就可以认为创建子进程失败.
再先简单了解两个函数:
getpid():获取当前进程的 pid值,
getppid():获取当前进程的父进程的pid值
测试代码
import os
print("I am %d" % os.getpid())
pid = os.fork()
print(pid)
if pid == 0:
print("I am child %d" % os.getpid())
else:
print("I am father %d an my child is %d" % (os.getpid(),pid))
执行结果:
I am 1131
1132
I am father 1131 an my child is 1132
0
I am child 1132
代码解释
导入 os 模块后,我们先来打印看看当前进程的 pid 是1131
, 然后调用 fork(). pid = os.fork()
在这里我们用 pid 接收创建子进程后第一次返回的值, 这个值会是子进程的 pid, 我们在打印出来看看是1132
, 因为这个值是大于零的一个子进程的 pid, 所以 执行 else后面的代码, 这里会打印出父进程的 pid 1131
和子进程的 pid 1132
, 在这之后, 会在子进程里返回一个值, 这个值想都不用想就是0
啦, 所以执行 if pid == 0 后面的代码, 这里就会打印出子程序的 pid 1132
了.
其实理解起来不难, 而我花了几个小时, 整个晚修都在思考这个问题, 为什么他会返回两次呢, 怎么返回两次呢? 我心中的疑问我也忘记是什么了, 到后来我才发现, 原来是我看漏了一句很重要的话 , 会把当前进程也就是父进程复制一份为'子进程', 然后分别在父子进程之中返回, 而且会先执行父进程.
, 他说的是分别在父进程和子进程中返回, 上面的程序中第一次是在执行代码的时候(这时候是父进程)返回的值,这个值是子进程的pid, pid 是大于零的唯一整数, 所以执行 else 后面的代码, 当 else 后面的代码执行完毕之后, 就会执行子进程, 子进程就会返回一个0值(永远都会返回0)这时候就会执行if pid == 0 后面的代码了.