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!!