[C] system call e pipe

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

[C] system call e pipe

Messaggioda neofitabo » lunedì 27 febbraio 2017, 16:13

Salve ho un problema con il seguente esercizio:
Scrivere un programma C in cui un processo crei n processi figli e altrettante pipe attraverso le quali
il processo padre comunica ad ogni figlio gli id degli altri fratelli attraverso n-1 comunicazioni distinte.
Il primo dubbio che mi sorge è il seguente: per la richiesta delle pipe, mi basta dare semplicemente il comando pipe dal padre e poi fare n fork e quindi così ottenere n pipe distinte? Il secondo dubbio è su come ho implementato la soluzione (ammesso che sia questo il modo giusto e dunque non in contrasto con il mio primo dubbio), la ricezione avviene in maniera esatta, ma succede una cosa insolita. Faccio un esempio per spiegarmi: supponiamo di avere 3 processi figlio generati con pid= 10 ,11,12. Il padre invia al primo solo 11 e 12 al secondo solo 10 e 12 e così via. Nella stampa che ho messo accade però che i pid sono mandati a partire dall' ultimo processo, quindi mi capita la seguente cosa: Sono il processo 12 mio fratello ha pid=11, mio fratello ha pid=12 ; sono il processo 11 mio fratello ha pid=10, mio fratello ha pid=12 ; sono il processo 10 mio fratello ha pid=10, mio fratello ha pid=11 . Grazie a chiunque risponderà.

Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int n,m;
   printf("inserisci numero di processi\n");
   scanf("%d",&n);
   int fd[2];
   pid_t pid[n],temp,padre;
   padre=getpid();
   pipe(fd);
   
   
   for(int i=0;i<n;i++)
   {
      if((pid[i]=fork())==-1){perror("fork non eseguita");}      
         
      
      else
      {
         
      }
   }
   
   for(int k=0;k<n;k++)
   {
      for(int j=0;j<n;j++)
      {
         
      
            if(pid[k]==0 && j<(n-1))
            {
               if(j==0 && pid[k]==0)
               {
                  printf("sono il pid=%d \n",getpid());
               }
               
               read(fd[0],&temp,sizeof(pid_t));
            
               
               printf("mio fratello ha pid %d\n",temp);
               
               
            }
            if(getpid()==padre)
            {
               if(k!=j)
               {
                  
                  write(fd[1],&pid[j],sizeof(pid_t));
               }
            }
         
      }
      if(pid[k]==0)
      {
         exit(k);
      }
      
   }
   
   
   
   for(int l=0;l<n;l++)
   {
      waitpid(pid[l],NULL,0);
   }
   
}
neofitabo
Prode Principiante
 
Messaggi: 6
Iscrizione: febbraio 2017
Sesso: Maschile

Re: [C] system call e pipe

Messaggioda DavideDaSerra » venerdì 10 marzo 2017, 17:57

primo dubbio: NO, così crei una sola pipe, devi crearne N

Codice: Seleziona tutto
typedef int[2] pipe_t

pipe_t pipes[N]

for (size_t i =0; i<N;++i)
pipe(pipes[i]);


ogni 'soggetto' dovrà poi ricordarsi di chiudere le pipe che non usa es: se il primo figlio deve comunicare col secondo avrò:

Codice: Seleziona tutto

size_t figlio(int id){
// ipotizziamo che ogni figlio legga dal precedente e scriva al suvvessivo
char buff;
for(size_t i=0; i<Nfigli; ++i){
if(i!=id-1&&id!=0) close(pipes[i-1][0]) //chiudo il lati di lettura
if(i!=id) close(pipes[i][1]) //chiudo i lati di scrittura
}
if(id==0){//se sono il primo figlio inizio la catena
printf("sono il primo figlio\n");
write(pipes[i][1],&buff,1)
}else{
printf("sono il figlio %d\n",id);
read(pipes[i-1][0].&buff,1);
write(pipes[i][1],&buff,1)
}


}

int main (int argc, char** argv){

for(size_t i=0; i<Nfigli-1; ++i)
pipe(piped[i]);

for (size_t i=0; i< Nfigli; ++i){

if(fork()==0) figlio(i);
}
// di qui in poi solo il padre

for(size_t i = 0; i< Nfigli; ++i){
close(pipes[i][0]) //chiudo tutte le pipe in lettura (per il padre)
close(pipes[i][1]) //chiudo tutte le pipe in scrittura (per il padre)

printf("il padre ha finito\n");
exit(EXIT_SUCCESS);
}

}




così dovresti avere qualcosa del tipo:

sono il primo figlio
sono il figlio 1
sono il figlio 2
...
sono il figlio nfigli -1
DavideDaSerra
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 343
Iscrizione: febbraio 2009
Località: Da qualche parte in quel di Modena
Desktop: xubuntu
Distribuzione: Ubuntu12.10 x86_64


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 3 ospiti