questo è il thread che apre magari può aiutarvi a capire..

codice:
void *rubrica(void * connectsock)

{

    /*prototipi di funzioni per il thread safety*/

    ssize_t readn(int fd, void *buf, size_t n); 

    ssize_t writen(int fd, const void *buf, size_t n);

    ssize_t readline(int fd, void *vptr, size_t maxlen);

        

    struct elemrubrica app_elemrubrica; 

    		

    /*prototipi di funzioni*/

    void estrazione(int connectsock, FILE * fp, struct elemrubrica app);

    void inserimento(int connectsock, FILE * fp, struct elemrubrica app);

	

    int risp; /*conterrà il valore convertito in intero della 

               *risposta del client*/

    int n;        

    ssize_t nread; 

         

    char buffer[MAXLINE]; /*buffer di lettura/scrittura*/



    /*controllo sul detaching del thread*/

    if((n = pthread_detach(pthread_self())) != 0) 

    {

        errno = 0;

        fprintf(stderr, "pthread_detach error");

	exit(1);

    }

    

    FILE * fp;

    /*controllo sull'apertura del file*/

    if((fp=fopen("prova.txt","r"))==NULL)

    {

        fprintf(stderr, "error opening file");

        exit(1);

    }



     

    do

    {

        /*lettura della scelta dell'operazione dal client*/

        if((nread=readline((int)connectsock,(void *)buffer,MAXLINE)) == 0)

            return; /* connessione chiusa dal client */

          

        risp=atoi(buffer);

        

        switch(risp)

        {     

            case 1: 

                    estrazione((int)connectsock, fp, app_elemrubrica);

                    break;

    

            case 2: 

                    inserimento((int)connectsock, fp, app_elemrubrica);

                    break;    



            case 0:

                    /*uscita*/

                    break;

                

            default: 

                    /*tutti gli altri casi*/

                    break;

        }

    }while(risp != 0);

    

    fclose(fp);

}