如何在 C 程序中将 STDOUT 重定向到 STDIN

如何在 C 程序中将 STDOUT 重定向到 STDIN

假设我想编写一个 C 程序来执行与以下命令相同的命令:ls -l | wc -l

以下是一次尝试:

int main(){
    int fd;
    char *buffer[] = {"ls", "-l", (char *) NULL};
    char *buffer1[] = {"wc", "-l",(char *) NULL};
    if(fork() == 0){
        // I make the STDOUT_FILENO and fd equivalent
        if((fd = dup(STDOUT_FILENO)) == -1){
            perror("error");
            exit(EXIT_FAILURE);
        }
        close(fd);
        if(fork() == 0)
            execvp(buffer[0], buffer);
        // then I make fd and STDIN_FILENO equivalent in order to put the output of the previous command
        // as the input of the second command
        if(dup2(fd, STDIN_FILENO) == -1){
            perror("error");
            exit(EXIT_FAILURE);
        }
        execvp(buffer1[0], buffer1);
    }

    exit(EXIT_SUCCESS);
}

但它只是运行ls -l而不将其输出提供给wc -l

答案1

您必须在两个进程之间创建一个管道。 (这也是您|在命令行上使用时发生的情况。)

有很多例子如何做到这一点,例如这里

基本上,您通过调用创建管道pipe(),然后每个进程关闭管道的一端。

相关内容