improve synchronization

- select() is always ready on regular file descriptors... whoops.
- we can just read() the frame and sleep a little if there's nothing
  there, this avoids taking 100% of the CPU.