ciao a tutti, devo fare un esercizio di sistemi operativi. questa più o meno è la consegna:
da riga di comando si hanno n figli (argv[1]) che lavorano su una variabile m(argv[0]).
il padre genera i n figli e crea il segmento di memoria condivisa. poi aspetta che i figli terminino l'operazione.
i figli lavorano con un semaforo per modificare la variabile m che dev'essere scritta nella memoria condivisa.
quando i figli terminano, il padre stampa il valore della variabile contenuta nella memoria condivisa
questo è il mio codice:
codice:#include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/shm.h> #include <sys/stat.h> int m; //mia variabile condivisa int main(int argc, char *argv[]) { int segment_id; int j; int size = 4096; sem_t *sem; char *shared_memory; pid_t pid; /* costruisce un segmento condiviso – padre e figlio condivideranno "sid" */ segment_id = shmget( IPC_PRIVATE, size, S_IRUSR | S_IWUSR ); if ( segment_id < 0 ) { // DEBUG printf("shared memory initilization failed\n"); return 1; } /* inizializza il semaforo */ sem = sem_init(&sem, 0, 1 ); if ( !sem ) { // DEBUG printf("error semaphore initilization\n"); return 1; } /* il padre attacca il segmento al suo spazio di indirizzi */ shared_memory = (char *)shmat( segment_id, NULL, 0 ); /* inizializzo m */ m = atoi(argv[0]); for (int x=0;x<atoi(argv[1]);x++){ // creo n figli (n = atoi(argv[1])) pid = fork(); if ( pid < 0 ) { // DEBUG printf("fork failed\n"); return 1; } } if (pid>0) // PADRE wait(NULL); // aspetta figli printf("valore: %s\n", m); //stampa il valore finale della variabile /* il figlio deve attacca il segmento al *suo* spazio di indirizzi */ if ( pid == 0 ) { shared_memory = (char *)shmat( segment_id, NULL, 0 ); do { sem_wait( sema ); /* entro nella sezione critica */ if (m%2 != 0) //modifica variabile m*=2; else m-=1; // memorizzo il valore di m nella memoria sprintf(shared_memory, m); sem_post( sema ); /* esco dalla sezione critica */ } while(1); } /* padre e figlio scollegano il segmento */ shmdt(shared_memory); /* il padre rimuove il semaforo ed il segmento */ if ( pid > 0 ) { sem_delete(&sem); shmctl(segment_id, IPC_RMID, 0 ); } return 0; }
ora, i miei dubbi riguardano sostanzialmente il come dichiarare la variabile m e come far sì che essa sia memorizzata nella memoria condivisa. è giusto come l'ho scritto io?
grazie in anticipo,
L.

Rispondi quotando


