Est-il possible de faire la différence entre EOL et EOF en mode canonique?

Si vous lisez des lignes depuis un terminal en mode canonique, existe-t-il un moyen de faire la différence entre une ligne terminée par EOL (Enter) et EOF (Ctrl-D)? Je crois comprendre que les deux renverront le nombre d’octets lus depuis read ().

Pour EOL sur une ligne vide, le nombre d’octets sera 1, pour la nouvelle ligne.

Pour EOF sur une ligne vide, le nombre d’octets sera 0, car «il n’y avait plus de données».

Regardez le dernier caractère lu (sauf si aucun caractère n’a été lu, auquel cas vous avez un EOF).

 int nr = read(0, buffer, sizeof buffer); if (nr > 0) { if (buffer[nr - 1] == '\n') { /* EOL typed */ } else if (nr == sizeof buffer) { /* Filled the buffer */ } else { /* Probably an EOF was typed, not at the start of a line */ } else if (nr < 0) { /* handle error */ } else { /* EOF */ }