用于在python中为unix制作玩具外壳的mutistage管道

时间:2015-10-24 09:57:04

标签: python shell

我想在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管道扩展此代码

1 个答案:

答案 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()