Как получить сигнал из пространства ядра в пространство пользователя?
Отправка сигнала из ядра в пространство пользователя
Ответы (3)
Чтобы получить сигнал из ядра в пользовательское пространство, используйте следующий код в вашем пользовательском пространстве и код пространства ядра, как показано ниже:
приложение пользовательского пространства:
signal(SIGIO, &signal_handler_func);
fcntl(fd, F_SETOWN, getpid());
oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, oflags | FASYNC);
определите функцию signal_handler_func:
void signal_handler_func (int sig)
{
//handle the action corresponding to the signal here
}
Модуль пространства ядра:
int ret = 0;
struct siginfo info;
memset(&info, 0, sizeof(struct siginfo));
info.si_signo = SIG_TEST;
info.si_code = SI_QUEUE;
info.si_int = 1234;
send_sig_info(SIG_TEST, &info, t);//send signal to user land
t - PID пользовательского приложения.
kill_proc_info()
вместо send_sig_info()
. Вы можете использовать макрос for_each_process()
, чтобы найти процесс по имени и получить его PID.
- person Chef Pharaoh; 10.02.2017
Используйте функцию ядра API kill_proc_info (int sig, struct siginfo * info, pid_t pid)
ПРИМЕЧАНИЕ. На самом деле это плохой ответ. Функции действительно отправляют сигнал в пространство пользователя, но правильный способ сделать это, поскольку задающий вопрос предполагает использование метода символьного устройства fasync, как описано здесь: http://www.xml.com/ldd/chapter/book/ch05.html#t4
Существует нечто, называемое интерфейсом NetLink, который предоставляет набор API для связи между процессом ядра и пользовательским процессом. Он похож на интерфейс сокета, а обмен данными является асинхронным и, следовательно, предпочтительнее IOCTL.
Обзор здесь: http://www.linuxjournal.com/article/7356