これを試してください:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char** argv)
{
int pipefd[2];
int childpid,childpid2;
char* cmd[3]={"ls",NULL,NULL};
char* cmd2[3]={"grep",".c",NULL};
pipe(pipefd);
if(childpid=fork()){
//parent
close(pipefd[1]);
dup2(pipefd[0],STDIN_FILENO);
execvp("grep",cmd2);
}else{
//child
//write
close(pipefd[0]);
dup2(pipefd[1],STDOUT_FILENO);
execvp("ls", cmd);
}
return 0;
}
実際、プログラムはすぐに終了します — 実際、親プロセスは前に終了します。 子が実行されるため、"test.c" の前にシェル プロンプトが表示されます。
これを親に追加することで、少し改善できます:
wait(childpid);
wait(childpid2);
これにより、両方の子の後に親が終了します。