unistd を使用して入力を Grep にパイプすることはできません。

unistd を使用して入力を Grep にパイプすることはできません。

IOパイプを持つシェルを作成しようとしていますが、grepをパイプするときにプログラムが失敗することがわかりました。私のパイプライン技術を簡単に説明するいくつかのコードは次のとおりです。

#include <unistd.h>
#include <stdio.h>
int main(int argc, char** argv){
        int pipes[2];
        pipe(pipes);
        char *argve[5];

        // "cat sh.c"
        argve[0] = "cat";
        argve[1] = "sh.c";
        argve[2] = NULL;
        if (!fork()){  
                close(pipes[0]);
                dup2(pipes[1],1);
                execvp(argve[0],argve);
                printf("ERROR\n");
        }
        close(pipes[1]);

        // "grep "include""
        argve[0] = "grep";
        argve[1] = "\"include\"";
        argve[2] = NULL;
        if (!fork()){
                dup2(pipes[0],0);
                execvp(argve[0],argve);
                printf("ERROR\n");
        }
        close(pipes[0]);

        int wstatus;
        while (wait(&wstatus)>0)
                ;
        return 0;
} 

インポートするライブラリごとに1行を生成する必要がありますが、プログラムを実行しても出力は生成されませんsh.c。この手法は、他の組み合わせ(例:「ls | cat」または「echo | cat」)と連携して機能します。 grepがパイプを拒否する理由はありますか?

関連情報