#include #include #include #include #include #include /* For O_* constants */ #include /* For mode constants */ #include char * semaphore_name = "/il_mio_semaforo"; sem_t * semaphore; int main() { sem_unlink(semaphore_name); semaphore = sem_open(semaphore_name, O_CREAT, 0600, 0); if (semaphore == SEM_FAILED) { perror("sem_open"); exit(1); } printf("[parent] ho creato il named semaphore\n"); // il semaforo vale 0 // "signaling": // il processo padre dà il via libera al processo figlio // tramite il semaforo switch (fork()) { case -1: perror("fork"); exit(1); case 0: // processo figlio printf("[child] prima di sem_wait\n"); // sem . wait () if (sem_wait(semaphore) != 0) { perror("sem_wait"); exit(1); } printf("[child] dopo sem_wait\n"); // procede con statement b printf("[child] statement b1\n"); exit(0); default: // processo padre sleep(3); printf("[parent] statement a1\n"); // sem.signal() printf("[parent] prima di sem_post\n"); if (sem_post(semaphore) != 0) { perror("sem_post"); exit(1); } // processo padre aspetta la conclusione del processo figlio wait(NULL); } return 0; }