Ciao a tutti ragazzi, apro un nuovo post per chiedervi delucidazioni sull'uso della memoria condivisa.
Due processi indipendenti devono sincronizzarsi mediante semafori. Ho pensato di mettere i semafori in un segmento di memoria condivisa al quale i processi possono collegarsi, ma ho un problema di sincronizzazione. In pratica il processo A dovrebbe creare il segmento condiviso, e il processo B vi accede dopo che il processo A lo ha creato. Il punto è che il processo B "arriva prima" ad accedere alla memoria, bloccandosi. Tutti i segnali che in futuro gli vengono inviati dal processo A non vengono eseguiti, ho pensato che quindi il problema fosse proprio questo. Posto un po di pseudo-codice:
Processo A:
codice:
//Inizializzazione
//crea la shared memory e i semafori
sem_init(&are_msg, 1, 0);
sem_init(&wake_server, 1, 0);
sem_init(&wake_client, 1, 0);
shmid= shmget(key, 2048,IPC_CREAT|0666);
shm = (char*)shmat(shmid,NULL,0);
printf("La shared mem. è all'indrizzo %p\n", shm);
are_msg = sem_open(SEM_NAME,0, 0644, 1);
wake_server = sem_open(SEM_SERV,0, 0644, 1);
wake_client = sem_open(SEM_CLI, 0, 0644, 1);
shmid = shmget(key, SHMSZ,0666);
shm = (char*)shmat(shmid,NULL,SHM_W);
printf("Sono collegato all'indirizzo: %p\n", shm);
//Produce msg, lo invia, e sveglia il client
sem_post(&are_message);
Processo B:
codice:
//Inizializzazione
//si collega alla shared memory
wake_client = sem_open(SEM_CLI, 0, 0666, 1);
shmid = shmget(key, SHMSZ,0666);
shm = (char*)shmat(shmid,NULL,SHM_W);
are_msg = sem_open(SEM_NAME,0, 0666, 1);
//Attende di essere svegliato dal server, non si sveglierà mai.
sem_wait(&are_msg);
Per far in modo che il processo B si sospenda in attesa che il processo A crei la memoria, avrei bisogno di un ulteriore semaforo, che però dovrà essere allocato nella shared memory che ancora non c'è....
Qualche consiglio?
Il risultato che voglio ottenere è:
Server si avvia Client si avvia
Server si sospende Client sveglia il server e invia msg
in attesa di un msg
Server invia risposta e Client si sospende in attesa di risposta
sveglia il client
Dimenticavo di dire che avvio i due processi con un makefile nel quale specifico:
./ProcessoA
./ProcessoB