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:
Processo B: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);
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'è....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);![]()
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

Rispondi quotando
Ho utilizzato i semafori con nome ed è andato tutto bene 