Allora ho un applicazione client-server in ambiente Unix con thread Posix. Ogni client che si collega al server genera un nuovo thread:
codice:
//...
pthread_attr_init(&attrib); 
pthread_attr_setdetachstate(&attrib, PTHREAD_CREATE_DETACHED);
		
/* creazione del thread */
t_esi = pthread_create(&thread, &attrib, miaFunzione, (void*)conn_fd);
//...
Questo crea il nuovo thread e viene iniziata miaFunzione. Tutto corretto i client sono connessi e il server è attivo. Al momento che il server viene terminato con Ctrl+C al segnale SIGINT è associato un handler che scrive l'ora di arresto del server in un file di log ed infine invia un messaggio sullo standard error:
codice:
void onClose()
{
    int fd_logfile;                 /* descrittore file di log */
    time_t ora_nonformat;           /* data non formattata */
    char ora_format[24];            /* array contenente la data formattata in char */
    time(&ora_nonformat);                  /* salvo in ora_nonformat l'ora attuale non formattata */
    ctime_r(&ora_nonformat, ora_format);   /* la formatto e la memorizzo in ora_format */

    if((fd_logfile = open("log.txt", O_RDWR | O_APPEND, S_IRWXU))<0)  /* apre il file log.txt */
        perror("Errore file di log"), exit(1);
        
    if ((write(fd_logfile, "\nSERVER ARRESTATO: ", 19))<0) /* scrive ora di avvio del server*/
        perror("Errore write 1b");

    if ((write(fd_logfile, ora_format, 24))<0)         /* continua a scrivere sul file */
        perror("Errore write 2b");
    close(fd_logfile);
        
    write(STDERR_FILENO, "Il server e' stato chiuso!", 26); 
    exit(0);
}
Il problema ora è: finchè non ci sono client connessi va tutto ok. Se ci sono client connessi ed il client viene terminato allora il messaggio SERVER ARRESTATO viene scritto nel log tante volte quanti sono i thread attivi. Come risolvere???