Warning: Undefined array key "view" in /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php on line 2

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php on line 47

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php on line 48

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php on line 49

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php on line 50

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php:2) in /var/www/html/wp-content/uploads/classes/so/1617/lab-examples/index.php on line 51
/** * Crea un processo figlio che legge numeri da tastiera e li deposita * in un'area di memoria condivisa; poi ne crea un altro che li rilegge. */ #include #include #include #include #include #include #define MAX_NUMBERS 30 /* legge numeri da tastiera mettendoli nella memoria condivisa */ void scrittore(int id) { int *p; int numero, q = 0; printf("\nProcesso Scrittore:\n"); // collega la memoria condivisa con lo spazio di indirizzamento (in lettura/scrittura) if ((p = (int *)shmat(id, NULL, 0)) == (int *)-1) { perror("shmat"); exit(1); } do { printf("\nNumero da inserire ('0' per finire): "); scanf("%d", &numero); if (numero == 0) break; p[++q] = numero; // scrive nella memoria (lasciando il primo slot libero) printf("Numero inserito: %d\n", numero); } while (q < MAX_NUMBERS); p[0] = q; // scrive nel primo slot, la quantita' di numeri depositati exit(0); } /* prende i numeri dalla memoria condivisa e li stampa a video */ void lettore(int id) { int *p; int i, q = 0; printf("\nProcesso Lettore:\n"); // collega la memoria condivisa con lo spazio di indirizzamento (in sola lettura) if ((p = (int *)shmat(id, NULL, SHM_RDONLY)) == (int *)-1) { perror("shmat"); exit(1); } q = p[0]; // legge quanti numeri ci sono nell'area condivisa printf("n.%d numeri depositati: ", q); for (i = 1; i <= q; i++) printf("%d ", p[i]); printf("\n"); // p[0] = -1; // tento di scrivere nel segmento: il figlio va in segfault (guardate all'output di 'dmesg') // printf("ho modificato il segmento condiviso!!\n"); exit(0); } int main() { int id_shm; // crea l'area di memoria condivisa id_shm = shmget(IPC_PRIVATE, sizeof(int) * (MAX_NUMBERS + 1), IPC_CREAT | IPC_EXCL | 0600); if (id_shm == -1) { perror("shmget"); exit(1); } // crea un primo processo figlio che scrive nella memoria condivisa if (fork() != 0) wait(NULL); else scrittore(id_shm); // dopo che il primo figlio e' uscito, il secondo legge dalla memoria condivisa if (fork() != 0) wait(NULL); else lettore(id_shm); // distrugge l'area di memoria condivisa shmctl(id_shm, IPC_RMID, NULL); exit(0); }