View Single Post
Old 15-07-2014, 15:54   #10
kwb
Senior Member
 
L'Avatar di kwb
 
Iscritto dal: Jul 2003
Città: Alessandria
Messaggi: 10167
Se proprio vuoi utilizzare un semaforo, puoi utilizzare un mutex: è un semaforo molto semplice ( il più semplice forse ) che permette di bloccare un processo. Richiede l'utilizzo delle funzioni pipe(), read() e write().

Come ti spiega il link che ho messo sulla pipe, se chi legge trova la pipe vuota si blocca e attende che arrivi qualcosa.

Qui un esempio:
Codice:
int main (int argc, const char * argv[])
{
	int fd[2]; // Il file descriptor per la pipe. Su fd[1] si scrive, su fd[0] si legge
	/*
	** dummy1 e dummy2 sono vettori di un singolo carattere.
	** Devo fare cosi' perche' le funzione read() e write() vogliono un puntatore
	*/
	char dummy1[1]={0}, dummy2[1]={0};

	if((pipe(fd))== -1)
	{
		printf("Error in pipe\n");
		return -1;
	}

	write(fd[1], "G", 1); //Scrivo un carattere per sbloccare tutti i processi

	if(fork()==0) //Figlio 1
	{
		read(fd[0], dummy1,  1); //Prendo dalla pipe il carattere (se c'e')
		write(fd[0], NULL, 1); //Svuoto l'uscita della pipe, cosi' nessun processo potra' partire

		/*
		** In questo punto del codice il figlio 1 ha il controllo completo.
		** Gli altri processi sono bloccati finche' la pipe non viene rilasciata
		*/

		write(fd[1], "G", 1); //Sblocco gli altri processi
		exit(0);
	}
	else if(fork()==0) //Figlio 2
	{
		read(fd[0], dummy2, 1);
		write(fd[0], NULL, 1);

		/*
		** In questo punto del codice il figlio 2 ha il controllo completo.
		** Gli altri processi sono bloccati finche' la pipe non viene rilasciata
		*/		

		write(fd[1], "G", 1); //Sblocco gli altri processi
		exit(0);
	}
	wait(NULL);
	wait(NULL);
	return 0;
}
EDIT: Devi aggiungere la libreria unistd.h come indicato nei link!!
__________________
Dell XPS 13 (9350) :: i5-2500K - HD6870 - AsRock Z68 Pro3 - Corsair Vengeance 8GB (4x2) DDR3 :: Samsung Galaxy S4 GT-i9505

Ultima modifica di kwb : 15-07-2014 alle 15:56.
kwb è offline   Rispondi citando il messaggio o parte di esso