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

2つのプロセス間にパイプを作成する必要があります。 (|コマンドラインで使用する場合も同様です。)

これを行う方法の多くの例があります。ここ

デフォルトでは、呼び出しによってパイプを作成し、pipe()各プロセスはパイプの一端を閉じます。

おすすめ記事