2013-04-09 118 views
2

我試圖實現一個程序,它在輸入中採用一系列參數,並依賴於它創建了相同數量的由管道實現的進程,其中每個進程都在管道中寫入,然後通過它給了父親。進程與管道之間的通信

這是我的代碼,它不會做我所需要的。

謝謝你的幫助。

#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 */ 

    // Genera i 10 processi 
    for(i=0;i<argc-1;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,strlen(*phrase)+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; 
     close(fd[1]);       /* chiude in scrittura */ 
     bytesread = read(fd[0],message,sizeof(message)); 
     printf("ho letto dalla pipe %d bytes: '%s' \n",bytesread,message); 
     close(fd[0]); 
    } 
    } 

    // 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)); 
    } 
} 

輸入:./pipes CMD1 CMD2 CMD3

I created the first child with pid 21552 
I wrote: 'cmd1' 
I read from the pipe 5 bytes: 'cmd1' 
I created the second child with pid 21553 
I read from the pipe -1 bytes:'' 
I wrote: ') ML?' 
I created the third child with pid 21554 
I read from the pipe -1 bytes:'' 
I write: ') ML?' 
Son: 1 
Son: 2 
Son: 3 
Ended process 101 
Ended process 102 
Ended process 103 
+0

目前尚不清楚你想要做什麼。你能解釋更多嗎? – Bechir 2013-04-09 15:07:01

+0

父進程必須在通信結束時收集並打印所有子進程輸入。謝謝你:) – 2013-04-09 18:15:46

回答

2

你有兩個問題:

首先,你是不是寫正確phrase到管道。你一直在寫phrase。對於第一個孩子來說,這對於其他人來說是可以的,它將是空字符串。

其次,創建第一個孩子後,您正在關閉fd[0]。你永遠不會收到來自其他進程的數據。

#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 - 1 ; 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

我試圖運行該程序,但它沒有正確完成,它停留在最後的循環! – 2013-04-09 18:14:30

+0

我的意思是這個過程並沒有像以前那樣結束。 – 2013-04-09 18:23:16

+0

@AnisNouri固定。這是'for'陳述的停止條件。它應該停止在這種情況下'我 Bechir 2013-04-09 19:27:31