Parce que le nc commande dans <(...) lira également à partir de stdin.
Exemple plus simple :
$ nc -l 9999 >/tmp/foo &
[1] 5659
$ echo text | cat <(nc -N localhost 9999) -
[1]+ Done nc -l 9999 > /tmp/foo
D'où vient le text aller? Via le netcat.
$ cat /tmp/foo
text
Votre programme et nc concourir pour le même stdin, et nc en obtient une partie.
epoll() ou poll() retournant avec E/POLLIN vous dira seulement qu'un single read() peut pas bloquer.
Non pas que vous puissiez faire beaucoup de lectures d'un octet jusqu'à une nouvelle ligne, comme vous le faites.
Je dis peut car un read() après epoll() retourné avec E/POLLIN peut encore bloquer.
Votre code essaiera également de lire après EOF et ignorera complètement les erreurs de lecture().