如何阻止execve退出原始程序

时间:2017-04-01 00:31:25

标签: c io pipe fork io-redirection

我已经编写了自己的shell并编写了一个处理三重管道的函数,但是我的shell在execve之后退出了一个问题。我认为问题是我需要多加一些时间?但我不完全确定在哪里,因为这完美地执行了管道程序。此实现中也没有使用wait(2),也不确定是否与它有关。感谢

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);
    }
}

1 个答案:

答案 0 :(得分:1)

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

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]