2013-09-05 102 views
1

我想實現在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

任何輸入?

+0

研究'sash'和'bash'等現有自由軟件shell的源代碼。而且,'strace -f'可以理解所涉及的系統調用。另外,請閱讀[高級Linux編程](http://advancedlinuxprogramming.com/] –

回答

0

我知道你正在嘗試編寫一個shell,但你有沒有考慮過使用popen?

FILE * p = popen(「cat tmp1.out | grep tmp | sort」,「r」);

+0

這很可能是一項家庭作業,所以我不認爲涉及'system','popen'和/或'/ bin/sh'適合賬單 –

+0

是的,我想從用戶那裏得到輸入 – user2210060

0

問題可能是您在循環中調用了waitpid(),因此在第一個過程終止之前您不會啓動第二個過程。但是現在如果達到管道緩衝區大小,現在第一個可能會掛起,並且您有死鎖或者進程可能被損壞的管道所殺死。另外,for(k=0; k<= num_of_pipes; k++)對我來說很陌生,因爲那個循環num_of_pipes+1

+0

waitpid()是由父母執行的,我之所以這麼做是因爲我希望父母等待第一個命令還有for循環num_of_pipes + 1次,因爲有num_of_pipes + 1個命令(每個命令都有一個進程),我希望我很清楚,令我困惑的是命令ls | grep tmp | sort正常工作:( – user2210060

+0

正常管道的兩邊應該是同時運行的,我仍然認爲問題可能是你的情況他們不這樣做,如果真的有問題,不同的程序可能會有不同的反應,我只需要調用'waitpid()'爲所有'processid [k]'有另一個循環之後把你所有的孩子都放在一起,看看會發生什麼。 –

+0

試過這種方式。在for(k = 0 ...)之後添加了一個單獨的for循環以等待子進程。仍然沒有運氣:( – user2210060