|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jul 2012
Messaggi: 21
|
[C], sistemi operativi: fork, memoria condivisa e semafori
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;
}
grazie, D. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:59.



















