我想在python中开发一个玩具外壳,它可以像unix shell一样。我想做多级管道,即cat file_name | grep word |厕所。 我做了单级管道。但我不能做多级舞台。 这是我的sinle舞台管道代码
def setup_pipe(cmd_list):
'''setting piping'''
std_in=os.dup(0)
std_out=os.dup(1)
(r,w)=os.pipe()
for index in range(len(cmd_list)):
if cmd_list[index] == '|':
cmd1=(cmd_list[:index])
cmd2=cmd_list[index+1:]
break
pid=os.fork()
if pid>0:
os.wait()
os.dup2(r,0)
os.close(w)
re=os.fork()
if re==0:
os.execvp(cmd2[0],cmd2)
else:
os.wait()
return
else:
os.dup2(w,1)
os.close(r)
os.execvp(cmd1[0],cmd1)
如何为mutistage管道扩展此代码
答案 0 :(得分:0)
我得到了解决方案。你必须拥有那么多管道和子进程。这是代码
for ind in range(len(cmd_list)):
if cmd_list[ind]=='|':
count+=1
cmnds=[]
j=0
for i in range(len(cmd_list)):
if cmd_list[i]=='|':
cmnds.append(cmd_list[j:i])
j=i+1
cmnds.append(cmd_list[j:])
pipes=[]
for i in range(count):
pipes.append(tuple(os.pipe()))
if os.fork()==0:
os.dup2(pipes[0][1],1)
for k in range(count):
for j in range(2):
os.close(pipes[k][j])
os.execvp(cmnds[0][0],cmnds[0])
else:
for i in range(1,count):
if os.fork()==0:
os.dup2(pipes[i-1][0],0)
os.dup2(pipes[i][1],1)
for k in range(count):
for j in range(2):
os.close(pipes[k][j])
os.execvp(cmnds[i][0],cmnds[i])
if os.fork()==0:
os.dup2(pipes[-1][0],0)
for k in range(count):
for j in range(2):
os.close(pipes[k][j])
os.execvp(cmnds[-1][0],cmnds[-1])
else:
for k in range(count):
for j in range(2):
os.close(pipes[k][j])
for i in range(count):
os.wait()
os.wait()