Я думаю, что самый простой способ - зарегистрировать символьное устройство, которое становится готовым, когда на устройстве есть какие-то данные.
Любой процесс, который пытается прочитать данные с этого устройства, затем переводит его в спящий режим, пока устройство не будет готово, а затем пробуждается, и в этот момент он может выполнять соответствующие действия.
Если вы просто хотите сообщить о готовности, читатель может просто прочитать один нулевой байт.
В этом случае пользовательская программа просто должна будет выполнить блокирующий вызов read () и будет соответствующим образом заблокирована, пока вы не проснетесь.
Вам понадобится понять механизм очереди ожидания планировщика ядра, чтобы использовать это.