Why only when `!readable`?  Turning on O_NONBLOCK only for stdin still affects other processes that share that file descriptor (which is probably mapped to stdout and stderr as well.)