Porque el nc
comando dentro de <(...)
también leerá desde stdin.
Ejemplo más simple:
$ nc -l 9999 >/tmp/foo &
[1] 5659
$ echo text | cat <(nc -N localhost 9999) -
[1]+ Done nc -l 9999 > /tmp/foo
¿De dónde salió el text
¿Vamos? A través de netcat.
$ cat /tmp/foo
text
Tu programa y nc
competir por el mismo stdin, y nc
obtiene algo de eso.
epoll() o poll() regresando con E/POLLIN solo le dirá que un único read() puede no bloquear.
No es que pueda hacer muchas lecturas de un byte hasta una nueva línea, como lo hace.
Yo digo puede porque un read() después de epoll() devuelto con E/POLLIN aún puede bloquearse.
Su código también intentará leer más allá de EOF e ignorará por completo cualquier error de lectura().