Visualizzazione dei risultati da 1 a 9 su 9

Visualizzazione discussione

  1. #6
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Le funzioni reti_readline e reti_writen sono queste (fornite dal professore):

    codice:
    /***************************************************************************
     *  reti_read
     *  legge tutti i dati disponibili nel buffer in una sola volta e poi li
     *  esamina un byte per volta. La read, invece, legge un byte per volta. 
     ***************************************************************************/
    ssize_t reti_read(int fd, char *ptr) {
            static int      read_cnt = 0;  /* numero di byte letti */
            static char     read_buf[MAXLINE]; /* buffer per mantenere i dati letti */
            static char     *read_ptr; /* puntatore al prossimo byte da leggere */
    
            if (read_cnt <= 0) {
                    /* se non ci sono byte disponibili nel buffer chiama la read. */
                    while ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) 
                          /* se la read fallisce perchè non ci sono sufficienti
                             dati riprova, altrimenti esce. */
                          if (errno != EINTR)
                              return(-1);
                    if (read_cnt == 0)
                          return(0);
                    read_ptr = read_buf;
            }
    
            /* legge il prossimo byte dal buffer e decrementa il numero dei byte 
               disponibili */
            read_cnt--;
            *ptr = *read_ptr++;
            return(1);
    }
    
    
    /***************************************************************************
     *  reti_readline
     *  legge un'intera riga utilizzando la reti_read 
     ***************************************************************************/
    ssize_t reti_readline(int fd, void *vptr, size_t maxlen) {
            int     n, rc;
            char    c, *ptr;
    
            ptr = vptr;
            for (n = 1; n < maxlen; n++) {
                if ( (rc = reti_read(fd, &c)) == 1) {
                    *ptr++ = c;
                    if (c == '\n')
                       break;       /* legge il newline, come la fgets() */
                } 
                else 
                    if (rc == 0) {
                       if (n == 1)
                            return(0);      /* EOF, non ha letto nulla */
                       else
                            break;          /* EOF, ha letto qualcosa */
                    } 
                    else
                       return(-1);          /* errore, errno settato dalla read() */
            }
    
            *ptr = 0;       /* inserisce uno 0 per indicare la fine dell'input, coma la fgets() */
            return(n);
            /* restituisce il numero di byte letti */
    }
    
    
    /***************************************************************************
     *  reti_writen 
     *  scrive n byte sul descrittore fd. Riprova fino a quando i dati non
     *  vengono effettivamenti scritti. 
     ***************************************************************************/
    ssize_t reti_writen(int fd, const void *vptr, size_t n) {
            size_t          nleft;    /* byte anora da scrivere */
            ssize_t         nwritten; /* byte scritti dall'ultima write */
            const char      *ptr;
    
            ptr = vptr;
            nleft = n;
            while (nleft > 0) {
                    if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
                       if (errno == EINTR)
                          /* richiama la write se la funzione è fallita perchè
                             nel buffer ptr non ci sono sufficienti byte. */
                          nwritten = 0;
                       else
                          return(-1);
                    }
    
                    nleft -= nwritten;
                    ptr   += nwritten;
            }
            return(n);
            /* restituisce il numero di byte scritti. */
    }
    Il codice, inoltre, è al 99% uguale a quello del professore. Eventuali modifiche di ottimizzazione devono, probabilmente, essere ancora spiegate al corso quindi chiedo scusa se il codice non è performante
    Ultima modifica di goatboy; 25-04-2015 a 17:15

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.