Denn die nc
Befehl in <(...)
liest auch von stdin.
Einfacheres Beispiel:
$ nc -l 9999 >/tmp/foo &
[1] 5659
$ echo text | cat <(nc -N localhost 9999) -
[1]+ Done nc -l 9999 > /tmp/foo
Woher kam die text
gehen? Durch die netcat.
$ cat /tmp/foo
text
Ihr Programm und nc
konkurrieren um die gleiche stdin und nc
bekommt etwas davon.
epoll() oder poll(), die mit E/POLLIN zurückkehren, werden Ihnen nur sagen, dass es sich um eine Single handelt read() darf nicht blockieren.
Nicht, dass Sie in der Lage sein werden, viele Ein-Byte-Lesevorgänge bis zu einem Zeilenumbruch durchzuführen, wie Sie es tun.
Ich sage kann weil ein read() nach epoll(), das mit E/POLLIN zurückgegeben wird, immer noch blockieren kann.
Ihr Code wird auch versuchen, über EOF hinaus zu lesen, und alle read()-Fehler vollständig ignorieren.