带有execve的子进程无限循环

child process infinite loop with execve

这是我的管道到管道函数:

我想将管道 (pip) 作为带有 dup2 的 STDIN 并使用 dup2

将新管道 (fd) 作为 STDOUT

问题是当执行到execve的时候命令执行了但是程序卡在了死循环

int *pipe_to_pipe(int *pip, char **cmd, char **envp) {

    int     *fd;
    int     pid;

    fd = (int *)malloc(sizeof(int) * 2);
    if (!fd || pipe(fd) == -1)
            error(1);
    pid = fork();
    if (pid == -1)
            error(1);
    if (pid == 0)
    {
            dup2(pip[0], STDIN_FILENO);
            dup2(fd[1], STDOUT_FILENO);
            close(fd[0]);
            close(pip[1]);
            execve((command_path), cmd, envp);
            exit(0);
    }
    wait(NULL);
    free(pip);
    return (fd);
}

例如,如果我的 int *pip 中有“hello world” 作为 char **cmd,我有 cmd[0] = "cat",cmd[1] = "-e"。 当我做 execve(path, cmd, envp); 程序猫“你好世界”和无限循环在这里。

我该如何解决这个问题?

问题出在我没有关闭父进程中的管道“pip”添加那些将由父进程执行的行修复一切

if (pid != 0){
close(pip[0]);
close(pip[1]);
wait(NULL);
}

否则它解决了我的问题我不明白为什么如果有人能向我解释我将不胜感激 感谢所有回答我的人 <3