我想實現在C.多個管道這是函數的主體部分是採用管道多管道實現用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包含目錄中的文件列表,與ls的輸出相同) 也沒有錯誤信息。但它只是在沒有在屏幕上打印任何內容的情況下退出(儘管最後一條命令的stdout是沒有改變)
PS:cat tmp1.out | grep tmp也能正常工作。 tmp1.out的
內容: 的a.out 樣品 shell.c tmp1.out tmp.out b.c
任何輸入?
研究'sash'和'bash'等現有自由軟件shell的源代碼。而且,'strace -f'可以理解所涉及的系統調用。另外,請閱讀[高級Linux編程](http://advancedlinuxprogramming.com/] –