Also may want to consider libEv or asio (boost if c++)., which wrap the lower levels and also add in features.
libEv is great if you want to keep watchers active while servicing many requests as those watchers fire.
For messages across processes, i have used signals, locks and shmem to get pretty optimal. With signals and
if your design/use allows you may even be able to go lock-free or a quick atomic lock if arch supports it.
If thread, you can use lock-free collections (have some in boost, and if c++14/17, may be in standard now).
-tl