#include #include #include #include #include #include #include /* For O_* constants */ #include /* For mode constants */ #include /* * creiamo una memory map per essere condivisa con il processo figlio * in questa memory map allocheremo un semaforo senza nome * che poi useremo tra processo padre e processo figlio * per farli sincronizzazare tra di loro: * * il processo figlio segnalerà al processo padre il "via libera" * (segnalazione) * */ #define MEMORYMAP_SIZE 1024 char * memorymap; int * global_counter; sem_t * shared_semaphore; int main() { // alloco la memory map condivisa memorymap = mmap(NULL, MEMORYMAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); if (memorymap == MAP_FAILED) { perror("mmap"); exit(1); } // riserviamo 4 bytes per global_counter global_counter = (int *) memorymap; // shared_semaphore = (sem_t *)(memorymap + sizeof(int)); // inizializziamo il semaforo // il semaforo verrà utilizza da processi if (sem_init(shared_semaphore, 1, 0) == -1) { perror("sem_init"); exit(1); } int pid; switch (pid = fork()) { case -1: perror("fork"); exit(1); case 0: // processo figlio // farà "qualcosa" // poi dà il via libera al processo padre // incrementando il semaforo printf("[child] premi invio:\n"); getchar(); printf("[child] prima di sem_post\n"); if (sem_post(shared_semaphore) != 0) { perror("sem_post"); exit(1); } printf("[child] bye\n"); exit(0); default: // processo padre // aspetta il via libera dal processo figlio printf("[parent] aspetto il via libera (prima di sem_wait)\n"); if (sem_wait(shared_semaphore) != 0) { perror("sem_wait"); exit(1); } printf("[parent] ho avuto il via libera\n"); if (wait(NULL) == -1) { perror("wait"); } } printf("[parent] bye\n"); return 0; }