non-block I/O