[C] system call e pipe
Inviato: 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à.
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);
}
}