2015-10-19 2 views
2

У меня есть модуль в ядре, в котором на конкретном событии/счете я хочу пробудить пользовательский поток, который будет считывать некоторые данные из модуля ядра через proc fs.Каков наилучший способ вызвать пользовательский поток из модуля ядра

Я пытаюсь отправить сигнал RT из модуля ядра в пользовательский поток, находящийся в состоянии ожидания. Сигнал вызовет его обработчик, и он будет дальше читать данные/буфер из ядра и хранить его в файлах.

Я столкнулся с неизвестной проблемой, используя этот подход, после отправки сигнала система повесилась и все остановилось.

Скажите, пожалуйста, если я использую правильный метод (используя сигналы), чтобы вызвать пользовательский поток из модуля ядра. Если это правильно, то какая из возможных причин может быть причиной блокировки.

есть ли какой-либо способ, который я могу использовать для реализации такой функциональности ... Пожалуйста, предложите/помогите.

KERNEL МОДУЛЬ:

static int send_signal(int data) 
{ 
    int ret; 
    struct siginfo info; 
    struct task_struct *t; 

    /* send the signal */ 
    memset(&info, 0, sizeof(info)); 
    /* I have tried 44 and 30 but both are not working */ 
    info.si_signo = sig_num; 
    info.si_code = SI_QUEUE; 
    info.si_int = data; 

    if (!g_user_pid) { 
     printk("error seding signal, pid is not configured"); 
     return -EAGAIN; 
    } 

    rcu_read_lock(); 
    t = pid_task(find_pid_ns(g_user_pid, &init_pid_ns), PIDTYPE_PID); 
    if (t == NULL) { 
     printk("invalid pid\n"); 
     rcu_read_unlock(); 
     return -EAGAIN; 
    } 

    printk("sending value %u to pid %d\n", info.si_int, (int)t->pid); 
    ret = send_sig_info(sig_num, &info, t); /* send the signal */ 
    rcu_read_unlock(); 

    if (ret < 0) { 
     printk("error sending signal\n"); 
     return ret; 
    } 
} 

PS: Я вызываю эту функцию из контекста прерывания.

ответ

1

Другой способ - создать файл устройства с помощью модуля ядра. Чтение из этого файла блокируется, пока драйвер не помещает данные. В этом случае приложение пользовательского пространства может открывать и считывать данные файлов устройства без каких-либо сигналов сна и ловушек.

Обновление:Here вы можете найти пример для создания файла устройства только для чтения. Вы должны добавить логику ожидания в hello_read_proc(), это создаст блок для чтения.

+0

Спасибо! Можете ли вы объяснить, как реализовать такую ​​вещь. или поделитесь ссылкой, чтобы понять это. –

+0

@PankajGupta Объяснение, как это сделать с нуля, займет половина книги или больше. Я предлагаю вам получить книгу о написании драйверов устройств Linux. – msw

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