Technically, you should do a read on the pipe to consume the wakeup bytes. It doesn't matter in this context, but a pipe has a fixed buffer size. If you were repeatedly using the pipe fd to unblock select, eventually you would fill that buffer unless you were reading when notified. Eventually, the writer trying to unblock you would block trying to write the wakeup bytes. So, just for practice, do the read.