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!