[C] system call e pipe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
neofitabo
Prode Principiante
Messaggi: 6
Iscrizione: sabato 4 febbraio 2017, 10:41
Sesso: Maschile

[C] system call e pipe

Messaggio da neofitabo »

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);
	}
	
}
DavideDaSerra
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: domenica 15 febbraio 2009, 15:26
Desktop: xubuntu
Distribuzione: Ubuntu12.10 x86_64
Località: Da qualche parte in quel di Modena

Re: [C] system call e pipe

Messaggio da DavideDaSerra »

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
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti