我管道正确吗?

Am I piping correctly?

对于我的管道函数,我正在使用 fork() 创建两个子进程,并尝试在调用 execvp() 之前将第一个子进程的内容通过管道传递给第二个子进程。我做错了什么,就像我做 ls -la |此外,输出是目录中文件的垂直列表。我对 c(和 c)中的管道很陌生,所以很可能这是一个被忽视的错误。感谢您的帮助!

void handle_pipe_cmds(char **args1, char **args2){
    char ** word1 = parse_space(*args1);
    char ** word2 = parse_space(*args2);

    int p[2];
    pipe(p);
    pid_t pid = fork();
    if (pid == -1) {
        printf("CANNOT FORK!");
    } else if (pid == 0) {
        dup2(p[1], STDOUT_FILENO);
        close(p[1]);
        int status = execvp(word1[0], word1);
        if (status != 0) {
            printf("%s failed\n", word1[0]);
            exit(1);
        }
        exit(0);
    } else {
        close(p[1]);
        wait(NULL);
    }

    pid = fork();
    if (pid == -1) {
        printf("CANNOT FORK!");
    } else if (pid == 0) {
        dup2(p[0], STDIN_FILENO);
        close(p[1]);
        close(p[0]);
        int status = execvp(word2[0], word2);
        if (status != 0) {
            printf("%s failed\n", word2[0]);
            exit(1);
        }
        exit(0);
    } else {
        close(p[1]);
        close(p[0]);
        wait(NULL);
    }

}

If I do ls -la | more, the output is a vertical list of the files in the directory.

这是因为 ls 程序知道它的输出流是否是终端,并且在两种情况下的行为不同。在终端上,它(可能)打印彩色条目,每行打印多个项目;对于管道或文件,它将每行只打印一个条目,没有颜色。有关详细信息,请参阅 man ls