#include #include #include #include #include #include /* For O_* constants */ #include /* For mode constants */ #include #include #include /* ***D07*** processo padre, processo figlio il processo figlio conta il numero di righe nel file /usr/share/dict/american-english il processo figlio scrive il risultato in una memory map condivisa con il processo padre. il processo figlio termina. il processo padre legge il risultato dalla memory map condivisa, lo scrive su stdout e poi termina. */ int * result; char * filename = "/usr/share/dict/american-english"; void child_process() { int fd = open(filename, O_RDONLY); if (fd == -1) { perror("open"); exit(1); } char buffer[1024]; int res; int row_counter = 0; while ((res = read(fd, buffer, sizeof(buffer))) > 0) { for (int i = 0; i < res; i++) if (buffer[i] == '\n') row_counter++; } // scriviamo il risultato nella memory map *result = row_counter; exit(0); } int main() { pid_t pid; // chiedo una memoria condivisa per il contatore condiviso tra i processi result = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1,0 ); if (result == MAP_FAILED) { perror("mmap"); exit(1); } pid = fork(); if (pid == -1) { perror("fork"); exit(1); } if (pid == 0) child_process(); if (wait(NULL) == -1) { perror("wait"); exit(1); } printf("[parent] result = %d\n", *result); return 0; }