2013-07-17 2 views
1

Я потянул свои волосы за настоящую странную проблему. Модуль ядра не может отправлять сигнал в пользовательское приложение (или пользовательское приложение не может получить) без 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); 
} 
+0

Выполняется ли ваше пользовательское приложение, если вы не печатаете? Также, как вы сигнализируете пользовательское приложение? – indiv

+0

Пользовательское приложение работает все время. Без printk вызывается signal_handler, но данные (копия из ядра) каким-то образом повреждаются. – ila

+1

@ user2492889 Просто догадаться - похоже, что происходит некоторая ошибка в стеке или памяти, которая скрывается при вызове 'printk'. Но без кода его невозможно сказать. – bbonev

ответ

0

Если вы используете signal не sigaction для установки обработчика, то помните, что signal удаляет обработчик после получения сигнала. И вы должны маскировать сигнал, чтобы он не прерывал ваш процесс при работе внутри обработчика сигнала. Я также не уверен в системном вызове ioctl внутри обработчика (см. Раздел man7 signal в разделе «Функции безопасности с использованием Async»).

Звонки на printk могут замедлить выполнение других операций (поскольку они блокируются при вводе-выводе или буферизации) вокруг этих вызовов, поэтому они могут замедлять синхронизацию (при этом могут возникнуть любые ошибки синхронизации).

+0

Это было разрешено. Проблема заключалась в повреждении памяти в виде точки by @ user2492889. И да, вы правы, что в сигнальном контексте необходимо использовать только безопасный сигнал Async. printk всегда вреден в обработке прерываний! – ila

Смежные вопросы