if (read(fd, char_letto, sizeof(char) == -1))

è errato , dovrebbe essere

if (read(fd, char_letto, sizeof(char)) == -1)

attento alla parentsi...

Inoltre la read legge solo un carattere, non appende un termnatore di stringa al carattere letto.

Quindi il while

while (strcmp (char_letto, "\n") != 0)

dovresti trasformarlo in

while (char_letto != '\n')

Inoltre devi fermarti quando hai raggiunto la fine del file; quindi devi teenrti in una variabile il numero di byte letti restituito dalla read; l'altro errore è che non ti allochi la stringa, inoltre char_letto non è necessario che sia un puntatore a un char, puo esere un semplice char e poi passi alla read il puntore alla variabile:

codice:
char* leggiLinea(int fd){
     //alloco un buffer per contenere stringhe di al massimo
     //255 caratteri
     char* stringa = (char *)malloc(256 * sizeof(char));
     char char_letto = '\0';

     //invoco la read passando il puntatore al carattere
     int bytes_letti = read(fd, &char_letto, sizeof(char));
     //se c'è errore nella lettura
     if(bytes_letti == -1)
          return NULL;
     int posizione_corrente = 0;
     //continuo a leggere finchè non trovo il carattere di
     //fine linea o finchè non raggiungo la fine del file
     while((char_letto != '\n') && (bytes_letti > 0)){
          //metto il carattere letto nella stringa
          stringa[posizione_corrente] = char_letto;
          posizione_corrente++;
          bytes_letti = read(fd, &char_letto, sizeof(char));
     }
     //se c'è stato errore ritorno null
     if(bytes_letti == -1){
         //istruzione per deallocare stringa
          free(stringa);    
          return null;
     }
     //aggiungo il terminatore di fine stringa
     stringa[posizione_corrente] = '\0';
     return stringa;
}
Il codice non l'ho provato perche non sono sotto linux.