Cで複数のパイプを実装しようとしています。これは、パイプを処理する関数の主要部分です
ProcesscommandwithPipes()
{
............................
for (k=0; k <= num_of_pipes; k++)
{
read[k]= -1;
write[k] = -1;
}
//create required number of pipes
for(j=0; j < num_of_pipes; j++)
{
if( pipe(fd) == -1 )
{
perror("Pipe failure");
return;
}
read[j+1] = fd[0];
write[j] = fd[1];
}
for(k=0; k<= num_of_pipes; k++)
{
pid = fork();
if(pid < 0 )
{
printf("fork failed\n");
}
else if (pid == 0)
{
if(write[k] != -1)
{
if( dup2(write[k],1) == -1){
perror("dup2 error");
exit(1);}
}
if(read[k] != -1)
{
if( dup2(read[k],0) == -1)
{
perror("dup2read error");
exit(1);
}
}
for (h=0; h<= num_of_pipes;h++)
{
close(write[h]);
close(read[h]);
}
if(execvp((const char*)commandArgv[k][0], commandArgv[k]) < 1)
{
perror("error");
exit(1);
}
exit(0);
}
else
{
processid[k] = pid;
printf("waiting on process:%d\n", processid[k]);
close(write[k]);
close(read[k]);
waitpid(processid[k], &status, 0);
}
}
何らかの理由で、次のコマンドは正常に機能します ls|grep tmp|sort
ただし、次のコマンドは機能しませんが、ほとんど同じ です cat tmp1.out|grep tmp|sort
(tmp1.outには、lsの出力と同じ、curディレクトリ内のファイルのリストが含まれています)エラーメッセージもありません.しかし、画面に何も出力せずに終了します(ただし、最後のコマンドのstdoutは変更されません)
PS: cat tmp1.out|grep tmpも正常に動作します。
tmp1.out の内容: a.out サンプル shell.c tmp1.out tmp.out bc
入力はありますか?