【问题标题】:Break loop when child process finishes子进程完成时中断循环
【发布时间】:2013-06-27 21:33:31
【问题描述】:

我正在尝试制作一个简单的程序,该程序将启动一个子进程,该子进程将字符串写入管道,而父进程计数,直到它从管道中获取字符串。然而,我的问题是,当程序运行时,它要么不计数,要么不会停止计数。我想知道如何检查子进程是否仍在运行,并且取决于计数循环的中断。

import os, time

pipein, pipeout = os.pipe()

def child(input, pipeout):  
    time.sleep(2)
    msg = ('child got this %s' % input).encode()
    os.write(pipeout, msg)

input = input()

pid = os.fork() 
if pid: 
    i = 0
    while True:
        print(i)
        time.sleep(1)
        i += 1
        try:
            os.kill(pid, 0)
        except OSError:
            break
    line = os.read(pipein, 32)
    print(line)
else:
    child(input, pipeout)

【问题讨论】:

    标签: python process parent-child pid


    【解决方案1】:

    你应该使用subprocess模块,然后你可以调用poll()

    使用 popen.poll()

    Explained here

    if Popen.poll() is not None:
        //child process has terminated
    

    [编辑]:

    “控制输入和输出流以及检索返回码的唯一方法是使用 subprocess 模块;这些仅在 Unix 上可用。”

    Source

    【讨论】:

    • 如果进程尚未终止,poll 将返回 None ,如果已终止则返回退出状态。检查< 0 没有意义。
    • 嗯,我没有使用子进程,所以它并没有真正帮助我
    • @mata 终止进程的代码是负数,如果需要,您可以检查特定代码
    • @SebastianRindom 如果你决定使用它,那么你可以实现这个功能
    • @SebastianRindom - 是的,但是您会错过任何进程自行终止的情况,因此您应该检查is not None
    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2013-04-28
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多