Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C] Comunicazione tra processi

    Ciao a tutti,
    in questi giorni sto svolgendo un esercizio sulla comunicazione tra processi con pipes, il cui testo è il seguente (scusate l'inglese):

    Write a program which creates three child process P1, P2 and P3, and pipes between the processes.
    Then P1 is to write a message to P2 who passes it to P3 who then passes it to P1, and so on.
    Each time P1 receives the message he changes it.

    Ho provato a svolgerlo in questo modo, ma mi dicono che è sbagliato.
    Potreste darmi una mano? Grazie in anticipo!

    codice:
    #include <stdio.h>
    
    int main()
    
    {
        
      int fdes[2];     // prima pipe
      
      int fdes2[2];    // seconda pipe
      
      int fdes3[2];     // terza pipe
    
      int pid;            // usato per controllo nel fork
      
      int pid2;           // usato per controllo nel fork
      
      int pid3;         // usato per controllo nel fork
    
      char *messaggio = "sis" ;      // primo messaggio
      
      char *messaggio2 = "op";        // secondo messaggio
    
      int i=0;
      
      char singolo;         // singolo carattere
      
      char buffer1[5];    // buffer tra processi
      
      char buffer2[6];      // buffer tra processi
      
      char buffer3[7];       // buffer tra processi
    
      
      pipe(fdes);          // creazione prima pipe
    
      pipe(fdes2);        // creazione seconda pipe
    
      pipe(fdes3);       // creazione terza pipe
    
    
    
    
      pid=fork();           // processo A
    
      if(pid != 0)          // se è il padre
      
       { 
             
             wait();         //aspetto 
         
             close(fdes[1]);   // chiudo la pipe fdes in scrittura poichè prima devo leggere
         
              while (singolo !='\0') {     // fino a che non ho letto tutto il messaggio
    
    		                singolo = read(fdes[0],1,sizeof(char)) ; // leggo ogni carattere
    
    		                buffer1[i] = singolo;  // metto il carattere letto nel buffer
    
    	                 	i = i + 1; // incremento il contatore per cambiare l 'indice del buffer
    
    		                }
         
    // ora che ho letto il mio messaggio apro la pipe in scrittura verso il secondo processo
         
         open(fdes[1]);  // pipe fdes aperta in scrittura. posso quindi passare il messaggio a B
    
         pid2=fork();   // processo B
    
    
         if(pid2 != 0)     // se è il padre
          { 
                 wait();     //aspetto 
            
                 close(fdes2[1]);   // chiudo la pipe fdes2 in scrittura poichè prima devo leggere
    
    
    		        while (singolo !='\0') {    // fino a che non ho letto tutto il messaggio
    
    		           singolo = read(fdes2[0],1,sizeof(char)) ; // leggo carattere per carattere
    
    		                  buffer2[i] = singolo; 	// metto il carattere letto nel buffer
    
    		                   i = i + 1; 	// incremento il contatore per cambiare l 'indice del buffer
    
    		                  }
    
            open(fdes2[1]);  // pipe fdes2 aperta in scrittura. posso quindi passare il messaggio a C
            
    	pid3=fork();    // processo C
    	
    
    	if(pid3 != 0)    // se è il padre
    	 
         {
                
                wait();    //aspetto 
    	 
          close (fdes3[1]);  // chiudo la pipe fdes3 in scrittura poichè prima devo leggere
    	
    		            while (singolo !='\0') {  // finchè non ho letto tutto il messaggio
    
    		              singolo = read(fdes3[0],1,sizeof(char)) ;  // leggo ogni carattere
    
    	                   	buffer3[i] = singolo; // metto il carattere letto nel buffer
    
    		                  i = i + 1; // incremento il contatore per cambiare l 'indice del buffer
    
    		                  }
      
      
              open(fdes3[1]);    // pipe fdes3 aperta in scrittura verso A
    
              *messaggio = *messaggio2; // cambio il messaggio	
    
    	 }
    
            else // sono nel proc C
            
             { 
                 
                 write(fdes3[1],buffer2,sizeof(buffer2));	 
                  
             }
    
          }
    
         else // sono nel processo B 
          
          {
              
               write(fdes2[1],buffer1,sizeof(buffer1));	  
               
          }
         
         
       }
      
      else //sono nel processo A
      
       {
           
           write(fdes[1],messaggio,sizeof(messaggio));	
             
       }
    
    }

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Formatta il codice usando il tag [CODE] per renderlo leggibile, come da Regolamento.

    Aggiornamento: ho provveduto io a formattare il codice inviato per questa volta.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466

    Re: [C] Comunicazione tra processi

    Originariamente inviato da Daniele1987
    (scusate l'inglese):
    If you simply copied the text, there's no need to worry about it.
    Ho provato a svolgerlo in questo modo, ma mi dicono che è sbagliato.
    Potreste darmi una mano? Grazie in anticipo!
    codice:
    #include <stdio.h>
    ...
    pid = fork();
    Devi includere l'header <unistd.h>
    Il programma vià in Segmentation Fault.
    Qui da me sono le 4.41 AM, non l'ho guardato molto, ma ti consiglio, nel caso non trovi l'errore, di chiedere al buon vecchio amico gdb

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ma tanto per dirne una, la read() non si usa in quel modo... e nemmeno le pipe.
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.