#include #include #include #include #include #include /* For O_* constants */ #include /* For mode constants */ #include #include #include /* ***D10*** il processo padre crea 10 processi figli; il processo figlio i-mo calcola fibonacci(i) ma i valori di fibonacci(i-1) e fibonacci(i-2) li ottiene dai processi figli (i-1) e (i-2), ovvero deve attendere che questi processi producano i valori di fibonacci corrispondenti, prima di poter svolgere il suo calcolo. viene usata una unica memoria condivisa tra tutti i processi, per consentire ai processi figli di restituire i 10 valori. il processo padre scrive su stdout i valori di fibonacci restituiti dai processi figli: fibonacci(0) fibonacci(1) ... fibonacci(9) */ #define N 10 int * map; sem_t * semaphores; unsigned int fibonacci(unsigned int i) { switch (i) { case 0: return 0; case 1: return 1; default: //printf("sem_wait %d\n", i-1); if (sem_wait(&semaphores[i-1]) != 0) { perror("sem_wait"); exit(1); } //printf("sem_wait %d\n", i-2); if (sem_wait(&semaphores[i-2]) != 0) { perror("sem_wait"); exit(1); } return map[i-1] + map[i-2]; } } void process(int i) { map[i] = fibonacci(i); //printf("sem_post %d\n", i); if (sem_post(&semaphores[i]) != 0) { perror("sem_post"); exit(1); } if (sem_post(&semaphores[i]) != 0) { perror("sem_post"); exit(1); } exit(0); } int main() { map = mmap(NULL, sizeof(int)*10 + sizeof(sem_t)*10, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1,0 ); if (map == MAP_FAILED) { perror("mmap"); exit(1); } semaphores = &map[sizeof(int)*10]; for (int i = 0; i < 10; i++) { if (sem_init(&semaphores[i],1,0) != 0) { perror("sem_init"); exit(1); } switch (fork()) { case -1: perror("fork"); exit(1); case 0: process(i); default: ; } } while (wait(NULL) != -1) ; for (int i = 0; i < 10; i++) { printf("fibonacci(%d) = %d\n", i, map[i]); } return 0; }