Um sinal é uma comunicação clássica entre o kernel e o processo em alguns casos. Claro, qualquer processo com UID apropriado pode usar kill()
para enviar um sinal, mas sinais como SIGCHLD
ou SIGWINCH
quase sempre vêm do kernel.
Específico para o Linux, você pode examinar a chamada do sistema signalfd()
. O manuseio usual do sinal é via "upcall", mas signalfd()
fornece ao processo uma maneira diferente de receber sinais.
O valor de retorno das chamadas do sistema pode ser considerado uma comunicação de processo do kernel para o usuário. Isso varia muito, mas fork()
é um exemplo. O processo pai recupera um ID de processo diferente de zero (ou -1 no erro) e o processo filho retorna zero.
As chamadas de sistema poll()
e select()
têm argumentos em que o kernel define valores nos argumentos para indicar quais descritores de arquivo têm quais eventos / mudanças de estado estão disponíveis para eles. Isso é mais como um argumento formal "inout", mas o kernel define valores.
A API inotify
permite a comunicação do kernel para o processo por meio de um read()
em um descritor de arquivo especial.
O sistema de E / S assíncrona POSIX parece ter várias maneiras de se comunicar com um processo do usuário, incluindo iniciar um encadeamento quando ocorre uma E / S, se eu ler a página man corretamente. Eu nunca fiz E / S assíncrona POSIX, e parece complicado.