codice:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include "strutture.h"   //--->questa è una mia libreria testata è funzionante


void *fun(void *x)
{
   char buftime[26];
   int fd = *((int *)x);
   time_t ora;
   time (&ora);
   ctime_r(&ora,buftime);
   
   printf("fdclient = %d\n",fd);
  
  // if ( (write(fd,buftime,26)) <0)
   //{
     // perror("errore write");
      //exit(-1);
   //}
   
   close(fd);
   return NULL;
}


int main(int argc, char *argv[])
{
   int fdserver,j,err;
   int fdclient;
   int num =0;
 
   struct sockaddr_in indirizzo; //struttura che contiene i dati del server
   


   /*Alloco lo spazio per alpiù 20 client   */
   pthread_t tid[MAX_CLIENT];
   //----> MAX_CLIENT è una costante in strutture.h 
   
   *CREAZIONE DEL SERVER */
   struct sockaddr_in indirizzo;
   indirizzo.sin_family       = AF_INET;
   indirizzo.sin_port         = htons(5011); 
   indirizzo.sin_addr.s_addr  = htonl(INADDR_ANY);
   
   /*socket di comunicazione*/
   if ((fdserver=socket(AF_INET,SOCK_STREAM,0)) < 0)
   { perror("errore socket"); exit(-1); }
  
   
   
   /*bind*/ 
   if ( bind(fdserver,(struct sockaddr *)&indirizzo,sizeof(indirizzo)) < 0)
   { perror("errore bind"); exit(-1); }

   /*Metto il server in ascolto di massimo MAX_CLIENT*/
   if (listen(fdserver,MAX_CLIENT)<0)
   { perror("errore listen"); exit(-1);}
      
   while(1)
   {
      /*Servono per sapere l'indirizzo del client che si è appena collegato*/
      struct sockaddr_in indirizzo_client;
      socklen_t client_size = sizeof(indirizzo_client);
      
      /*accetto la connessione di un nuovo cliente*/
      if ((fdclient=accept(fdserver,(struct sockaddr *)&indirizzo_client,&client_size))<0)
      { perror("errore accept"); exit(-1); }
      
     
      printf("num = %d\n",num); //----->>> CADO QUI
      
      /*accettato il client creo un nuovo thread per la gestione concorrente del server*/
      if( (err=pthread_create(&tid[num],NULL,fun,(void *)fdclient))!=0)
      {  printf("errore %s\n",strerror(err));   exit(1);  } 
   
      num++;
      
      printf("ho creato il thread\n");
   }//fine while 
   
   //-----> Questa parte finale è ancora da sistemare perchè il programma cade prima
   /*aspetto la chiusura di tutti i thread*/
   for (j=0;j<num;j++)
   {
      pthread_join(tid[j],NULL);
      num--;
   }
   printf("finito.\n");
   
   
   
   free(tid);
   close(fdserver);
   exit(0);
}
Questo è tutto, a meno di stampe che servono a me per il debugging.
L'ultima cosa che stampa il server è: num = 0;