次のようなコマンドを実行する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()
各プロセスはパイプの一端を閉じます。