Вы можете использовать socketpair () для создания пары подключенных сокетов AF_UNIX. Это лучше, чем pipe (), поскольку допускает двунаправленную связь. Если этого недостаточно для ваших нужд, другой вариант (для которого требуется демон root) - использовать патчи пока еще не в mainline-Linux CUSE для создания драйвера устройства. в пространстве пользователя делать все, что угодно. Или вы можете просто подключиться к любому циклу событий, который будет использовать ваш пользователь ...
Новый linux eventfd также может эмулировать POLLIN / POLLOUT, хотя не одновременно оба - установите его значение равным 0xfffffffffffffffe для POLLIN, но не POLLOUT, 0 для POLLOUT, но не POLLIN, или что-то еще для обоих.
Кроме этих опций, нет платформенно-нейтрального способа сделать это, нет. Обычный шаблон - использовать FIFO только для пробуждения цикла событий и опрашивать его, используя какой-то другой API, как только он проснется.