Unix Python中fork调用后过早退出脚本(创建管道) 代码片段内部调用(argv)函数

Unix Python中fork调用后过早退出脚本(创建管道) 代码片段内部调用(argv)函数,unix,python-3.x,fork,pipe,dup2,Unix,Python 3.x,Fork,Pipe,Dup2,上面的代码只通过两个命令的简单管道给出结果,但它会导致shell过早退出。如何使此代码停止退出脚本并使其返回到命令提示符 程序的工作原理 子级执行第二个命令。通过使用dup2()调用沿管道重定向输出,将其输出发送到管道。这是通过使用sys.stdout值更改管道写入文件描述符来实现的 然后,父级将输入重定向与dup2()调用一起使用。这将生成最终输出,然后在屏幕上显示,但直接在脚本退出后显示 run函数调用接收命令及其参数。它执行给定的命令。它还运行全局定位和输入输出重定向 这可能很简单,但我似

上面的代码只通过两个命令的简单管道给出结果,但它会导致shell过早退出。如何使此代码停止退出脚本并使其返回到命令提示符

程序的工作原理 子级执行第二个命令。通过使用dup2()调用沿管道重定向输出,将其输出发送到管道。这是通过使用sys.stdout值更改管道写入文件描述符来实现的

然后,父级将输入重定向与dup2()调用一起使用。这将生成最终输出,然后在屏幕上显示,但直接在脚本退出后显示

run函数调用接收命令及其参数。它执行给定的命令。它还运行全局定位和输入输出重定向


这可能很简单,但我似乎看不出是什么导致了问题…

在shell中,
parent | child
将从左到右,从父到子写入。在代码中,它是向后的。为什么产出方向颠倒了?什么是
run()
?您可能应该在
dup2()
之后立即放置
close()
。如果使用
close(如果不是pid,则为r),会发生什么情况;execlp(lst[非pid],lst[非pid])
而不是
run()
if '|' in argv:

  # Split argv into two commands, lst[0] and lst[1]
  r,w=os.pipe()
  pid=fork()

  # Parent
  if pid >0:
    os.close(w)
    os.dup2(r,0)
    run(lst[0])
    os.close(r)
    os.wait()

  # Child
  if pid==0:
    os.close(r)
    os.dup2(w,1)
    run(lst[1])
    os.close(w)
    os._exit(1)