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