Ciao a tutti, ho un piccolo dilemma che non riesco a risolvere. Ho un server e un client che comunicano tramite socket, per ogni client il server avvia un thread che si incarica di gestire la richiesta. I clienti si sincronizzano tramite un semaforo tra di loro (accesso alla risorsa comune "socket"), e con i thread attraverso un altro. Il server "ignora" l'esistenza di questi semafori, poichè io li creo e li utilizzo nel codice dei thread in questo modo:
I client, invece, ne utilizzano 2 come già detto, uno è quello che utilizzano i thread, chiamato "nome semaforo", e un altro che utilizzano per sincronizzare la scrittura sulla socket:codice:char SEM_NAME[] = "nome semaforo"; void *thr_fun(void *par){ sem_t *sem; sem = sem_open(SEM_NAME, O_CREAT, 0644, 1); .......//faccio quello che devo e risveglio il ricevente. sem_post(sem); sem_close(sem); //terminazione thread. }
La sequenza sopra descritta sembra funzionare, facendo una prova sommaria tutti i clienti riescono a comunicare con i server. Ma ora sorge il mio dubbio: chi dovrebbe essere incaricato di eliminare i semafori tramite sem_unlink() ? Questi andranno eliminati alla fine dell'esecuzione del programma, quindi quando non ci saranno più clienti, e questo lo può conoscere solo il server. Se però io inizializzo i semafori nel server, questi non vengono gestiti correttamente e le comunicazioni non avvengono regolarmente. Sicuramente sbaglio l'approccio, per questo chiedo aiuto a voi: come posso eliminare i semafori mantenendo questa struttura, o in alternativa, come devo modificare la stessa per rendere i semafori "visibili" al server e funzionanti al tempo stesso? Grazie mille!codice:char SEM_NAME[] = "nome semaforo"; char SEM_CLI[] = "client semaforo"; void client(){ sem_t *sem, *semcli; sem = sem_open(SEM_NAME, O_CREAT, 0644, 1); semcli = sem_open(SEM_CLI, O_CREAT, 0644, 1); sem_wait(sem_cli); //scrittura su socket sem_post(sem_cli); //attesa risposta sem_wait(sem); //terminazione; }

Rispondi quotando