2013-04-07 100 views
0

我已經通過使用一個管道成功地管道輸出了一個命令。N命令管道「進程間」

我想和其中每個命令表示處理N個連續的命令來做到這一點。

這是我在流水線一條命令的嘗試,因此,爲了使命令的具有N序列我需要N-1的管道?以及所有進程的父親如何收集輸出並打印輸出。

謝謝。

#include <stdio.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <string.h> 

int main(int argc ,char *argv[]) 
{ 
    int i,pid; 
    int fd[2];//crea i descriptor 
    char phrase[30][30];//crea il buffer 
    pipe(fd); /* crea la pipe */ 

    for(i=0;i<argc;i++) 
    { 
     if((pid=fork())==0) 
     {    
      strcpy(phrase[i], argv[i+1]); 
      printf("ho scritoo :'%s'\n",phrase); 
      close(fd[0]);       /* chiude in lettura */ 
      write(fd[1],phrase[i],strlen(phrase[i])+1); /* invia anche 0x00 */ 
      close (fd[1]);     // chiude in scrittura 
      // pid=0 -> figlio 
      usleep(50000*(1+i));  // Ritardo iniziale 
      printf("Figlio: %d\n",i+1); // Stampa messaggio del figlio 
      usleep(500000*(1+i));  // Ritardo finale 
      return(101+i);   // Termina con codice di ritorno 
     } else { 
      printf("Ho generato il figlio %d con pid %d\n",i+1,pid); 
      char message[100]; //creare il buffer 
      memset(message,0,100); 
      int bytesread; 

      bytesread = read(fd[0],message,sizeof(message)); 
      printf("ho letto dalla pipe %d bytes: '%s' \n",bytesread,message); 
      // close(fd[0]); 
     } 
    } 
    close(fd[0]);       /* chiude in scrittura */ 
    close(fd[1]);       /* chiude in scrittura */ 
    // Attende che dieci processi terminino 
    for(i=0;i<argc-1;i++) 
    { 
     int status; 
     wait(&status);  // Attende termine di un figlio (uno qualunque) 
     printf("Terminato processo %d\n",WEXITSTATUS(status)); 
    } 
    return 0; 
} 

回答

0

是的,你將有N-1個管道進行N個過程。您可以將所有進程打印到標準輸出。由於每個子進程都將繼承父進程的stdout,因此它們都將打印到父進程的標準輸出設置。如果通過將stdout重定向到一個文件來啓動鏈,那麼它們將全部打印到該文件。該問題將同步他們的寫入,使他們不寫在另一個人的寫作中。

如果您想將所有子輸出重新填充到原始父項,您可以讓每個子項只將其從其子項的管道中讀取的所有內容寫入其父項管道。每個孩子都以這種方式傳遞鏈條。

+0

我編輯我的代碼,並且我成功實現了N個子進程,其中父進程可以從孩子那裏讀取一個。問題是我希望父進程一次讀取所有進程的輸入。 – 2013-04-09 18:28:15

+0

我的輸入是:./pipes CMD1 CMD2 CMD3我創建了PID 21552 的第一個孩子我寫道:「CMD1」 我從管道中讀取4個字節:「CMD1」 我創建的第二個孩子的pid 21553 我寫的:「CMD2」 我從管道讀4個字節:「CMD2」 我創建具有pid 21554 第三子我寫:「CMD3」 我從管道4字節讀:「CMD3」 子:1 子:2 子:3 結束進程101 結束進程102 結束進程103 – 2013-04-09 18:33:30