此代码片段取自Programming Python第4版,稍作修改以适应我疯狂,愚蠢的目的:
#xyz.py
import os
def child():
print('Hello from child', os.getpid(), flush=True)
#os._exit(0)
def parent():
while True:
newpid = os.fork()
if newpid == 0:
child()
else:
print('Hello from parent', os.getpid(), newpid, flush=True)
if input() == 'q': break
parent()
我在终端运行:
$ python3 xyz.py
Hello from parent 5708 5709
Hello from child 5709
让我们从第一个过程开始。父母在else
之后继续执行并等待输入,q
打破,其他任何事情都要继续。
转到分叉的子进程;查看代码,任何分叉的子进程都会调用child
函数。 os_exit
已被注释掉,只是跳过了。因此,所有孩子也会执行parent
。对于第一个分叉的子进程,终端屏幕上有输出,但是孩子也会生孩子,因为它会继续执行parent
因此我们得到一个叉炸弹和终端屏幕应该被破坏:
Hello from parent 5708 5709
Hello from child 5709
...
我评论if input() == 'q': break
,我得到了预期的结果。小心这样做会使我的系统崩溃,我不得不在继续写这个问题之前硬关机。
由于input
位于print
parent
之后,因此应该有一个输出,孩子们应该继续生成自己的孩子,
input
如何阻止分叉儿童制作孙子孙女?