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:

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. 
}
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"; 
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; 
}
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!