Отправка сигнала из ядра в пространство пользователя

Как получить сигнал из пространства ядра в пространство пользователя?


person mohwastz    schedule 12.04.2011    source источник


Ответы (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 пользовательского приложения.

person Raulp    schedule 22.05.2012
comment
Не могли бы вы предоставить полный пример? - person dexterous; 23.04.2014
comment
Кроме того, как я узнаю pid пользовательского приложения? - person dexterous; 23.04.2014
comment
Приложение пользовательского пространства может зарегистрироваться в модуле во время инициализации с помощью сокетов netlink, и в сообщении регистрации они могут указать свой PID. - person Abhishek Sagar; 15.03.2016
comment
@dexterous_stranger Я сделал это, но использовал 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

person gby    schedule 12.04.2011
comment
#include ‹linux / module.h› #include ‹linux / kernel.h› #include ‹linux / signal.h› int init_module () {// int i, res = 0; // char msg1 [80]; struct siginfo info; printk (KERN_ALERT \ n ПРИВЕТ, МИР !!); info.si_signo = 14; // ДАЙТЕ НОМЕР СИГНАЛА ЗДЕСЬ !!!!! info.si_errno = 0; info.si_code = SI_USER; info.si_pid = current- ›tgid; info.si_uid = current- ›uid; kill_proc_info (14, & информация, 553); возврат 0; } void cleanup_module () {printk (KERN_ALERT \ n Прощай, мир !!);} MODULE_LICENSE (GPL); - person mohwastz; 12.04.2011
comment
сэр, скажите мне, что это за заголовочный файл? - person mohwastz; 12.04.2011
comment
заголовочный файл для функции ядра API kill_proc_info (int sig, struct siginfo * info, pid_t pid) - person mohwastz; 12.04.2011
comment
при выполнении моей программы я получил следующую ошибку - person mohwastz; 12.04.2011
comment
/home/wasimtabrez/Work/int/signal2.c: В функции 'init_module': /home/wasimtabrez/Work/int/signal2.c:24: ошибка: разыменование указателя на неполный тип / home / wasimtabrez / Work / int / signal2.c: 25: error: разыменование указателя на неполный тип /home/wasimtabrez/Work/int/signal2.c:27: error: неявное объявление функции 'kill_proc_info' make [2]: *** [/ home / wasimtabrez /Work/int/signal2.o] Ошибка 1 make [1]: *** [_module_ / home / wasimtabrez / Work / int] Ошибка 2 make [1]: выход из каталога `/usr/src/linux-headers-2.6 .35-28-generic 'make: *** [все] Ошибка 2 - person mohwastz; 12.04.2011
comment
Это может помочь people.ee.ethz.ch/~arkeller / linux / multi / - person duslabo; 06.12.2012

Существует нечто, называемое интерфейсом NetLink, который предоставляет набор API для связи между процессом ядра и пользовательским процессом. Он похож на интерфейс сокета, а обмен данными является асинхронным и, следовательно, предпочтительнее IOCTL.

Обзор здесь: http://www.linuxjournal.com/article/7356

person liv2hak    schedule 23.04.2011