为什么分叉的childern进程不输出到终端?

时间:2017-07-10 11:20:50

标签: python linux terminal fork

此代码片段取自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如何阻止分叉儿童制作孙子孙女?

0 个答案:

没有答案