Programming Tips - How do I make a selfpipe to send a message to myself.

Date: 2011nov24 OS: Linux Q. How do I make a selfpipe to send a message to myself. A. Selfpipes are handy. They can be use to catch a signal and send it to a select (But signalfd() does that now). Or to wake up a select() from another thread. Here is my selfpipe class:
--- selfpipe.h --- #include <unistd.h> #include <fcntl.h> #include <syslog.h> class SelfPipe { int selfpipe[2]; public: SelfPipe(); bool poke(); int getReadFd() const { return selfpipe[0]; } int getWriteFd() const { return selfpipe[1]; } }; --- selfpipe.cpp --- #include "selfpipe.h" SelfPipe::SelfPipe() { if (pipe(selfpipe) == -1) { syslog(LOG_ERR, "Could not create a selfpipe -- things are not going to work\n"); return; } fcntl(selfpipe[0],F_SETFL,fcntl(selfpipe[0],F_GETFL)|O_NONBLOCK); fcntl(selfpipe[1],F_SETFL,fcntl(selfpipe[1],F_GETFL)|O_NONBLOCK); } bool SelfPipe::poke() { return write(getWriteFd(), "X", 1) == 1; } --- end of selfpipe.cpp --- --- example main.cpp --- #include "selfpipe.h" WaitOnTwo(const int fd1, const int selfpipe_fd) { fd_set rfds; FD_ZERO(&rfds); FD_SET(fd1, &rfds); FD_SET(selfpipe_fd, &rfds); int nfds = MAX(fd1, selfpipd_fd) + 1; return select(nfds, &rfds, NULL, NULL, NULL); } SelfPipe selfpipe; ThreadMain() { int fd1, selfpipe_fd; fd1 = OpenSocketOrWhatever(); for (;;) { WaitOnTwo(fd1, selfpipe.getReadFd()); } } ElseWhere() { selfpipe.poke(); // Will wake up WaitOnTwo() }