我试图在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排序
但是下面的命令不起作用,尽管它几乎是一样的
分类tmp1.out grep tmp排序
(tmp1.out包含cur dir中的文件列表,与ls的输出相同)
也没有错误消息,但是它只是在屏幕上不打印任何东西(尽管最后命令的STDUT没有改变)。
附言:猫tmp1.out grep tmp也很好。
tmp1.out的内容:
A.退出
样品
壳牌公司
tmp1.输出
tmp.out公司
不列颠哥伦比亚省
有什么意见吗?
最佳答案
我知道你想写一个shell,但是你考虑过使用popen吗?
文件*p=popen(“cat tmp1.out grep tmp sort”,“r”);