Я потянул свои волосы за настоящую странную проблему. Модуль ядра не может отправлять сигнал в пользовательское приложение (или пользовательское приложение не может получить) без printk, должен выполнять фиктивный printk после или перед отправкой сигнала.сигнал пользовательского приложения из ядра
На самом деле, он отлично работает даже с пустым принтом. Но я пытаюсь понять, что происходит.
Любые мысли?
Вот Что происходит:
А - ядро) Char тип устройства модуль получает прерывание.
Он извлекает данные и передает сигнал пользователю.
/* должны сделать printk здесь */
Возвращение IRQ ручка.
B- пользователь)
Получает сигнал.
выдает системный вызов и считывает данные из буфера устройства символов. (Copy_to_user)
ядро:
void irq_handler(){
int i;
for(i =0; i < 32; i++)
GPIOdata[i] = read_gpio_status(i);
struct task_struct *p = find_task_by_pid(processinfo.pid);
if (NULL == p)
return;
send_sig(SIGUSR1, p, 0);
/* have to add printk here */
return IRQ_HANDLED
}
пользователь:
void signal_handler(int sig) {
char data[32];
ioctl(fd, READ_Data_from_Char_device, &data);
}
Выполняется ли ваше пользовательское приложение, если вы не печатаете? Также, как вы сигнализируете пользовательское приложение? – indiv
Пользовательское приложение работает все время. Без printk вызывается signal_handler, но данные (копия из ядра) каким-то образом повреждаются. – ila
@ user2492889 Просто догадаться - похоже, что происходит некоторая ошибка в стеке или памяти, которая скрывается при вызове 'printk'. Но без кода его невозможно сказать. – bbonev