I'm not certain, but your problem may be related to this caveat from the documentation for
select:
WARNING: One should not attempt to mix buffered
I/O (like `read' or <FH>) with `select', except as
permitted by POSIX, and even then only on POSIX
systems. You have to use `sysread' instead.
This is because, although select will tell you that there is some input waiting on the filehandle, there may not be enough input available to fill the buffer used by read() or <FH>. If this happens, the read will block waiting for more input. Switching to sysread() may fix your script.