2017-04-01 116 views
0

我写了自己的shell并编写了一个处理三重管道的函数,但是我的shell在execve后退出时遇到问题。我相信这个问题是我需要多花点时间?但我不完全确定它在哪里,因为这完美地执行了管道程序。在这个实现中也没有使用等待(2),也不确定这是否与它有关。谢谢如何阻止execve退出原程序

int fd[2]; 
int fd2[2]; 

if (pipe(fd) == -1) 
{ 
    perror("ERROR CREATING PIPE"); 
    return; 
} 

pid_t pid = fork(); 

if (args4[0] != NULL) 
{ 
    switch(pid) 
    { 
     case -1: 
      printf("%s\n", "fail to fork"); 
      return; 
     case 0: 
      if (pipe(fd2) == -1) 
      { 
       perror("ERROR CREATING PIPE"); 
       return; 
      } 
      switch(pid = fork()) 
      { 
       case -1: 
        printf("%s\n", "fail to fork"); 
        return; 
        break; 
       case 0: 
        if (dup2(fd2[1], STDOUT_FILENO) == -1) 
        { 
         printf("%s\n", "fail to dup"); 
         return; 
        } 
        close(fd2[0]); 
        close(fd2[1]); 
        execve(args2[0], args2, environ); 
        exit(1); 
       default: 
        if (dup2(fd2[0], STDIN_FILENO) == -1) 
        { 
         printf("%s\n", "fail to dup"); 
         return; 
        } 
        if (dup2(fd[1], STDOUT_FILENO) == -1) 
        { 
         printf("%s\n", "fail to dup"); 
         return; 
        } 
        close(fd2[0]); 
        close(fd2[1]); 
        execve(args3[0], args3, environ); 
        exit(2); 
      } 
      exit(3); 

     default: 
      if (dup2(fd[0], STDIN_FILENO) == -1) 
      { 
       printf("%s\n", "fail to dup"); 
       return; 
      } 
      close(fd[0]); 
      close(fd[1]); 
      printf("%s\n", "4"); 
      execve(args4[0], args4, environ); 
      exit(4); 
    } 
} 
+0

您需要针对您打算调用的每个子进程进行分支。 –

+0

是的,我明白,我无法确定要分叉的过程。我认为这将是execve(args2 [0],args2,environ),因为它是最后一次调用的过程。我已经在所有3位高管之前尝试过分叉,但没有任何帮助。 – ricefieldboy

+0

没什么好愚蠢的。谢谢。分叉args4 – ricefieldboy

回答

0

您分叉了两次,所以您有3个进程。它们中的每一个都被execve创建的相应进程替换。因为execve()不会返回(成功),所以您将永远不会到达exit()语句。这里是你的代码重写,而不管道(您清楚了解如何设置的管道)和没有不必要的语句:

pid_t pid = fork(); 
if (pid) { 
    execve(args4[0], args4, environ); 
} 
else { 
    pid = fork(); 
    if (pid) { 
     execve(args3[0], args3, environ); 
    } 
    else { 
     execve(args2[0], args2, environ); 
    } 
} 

看上面的重写代码可以更容易地看到,你会得到三个过程是这样:

args2 [0] | args3 [0] | arg4 [0]

相关问题