У меня есть модуль в ядре, в котором на конкретном событии/счете я хочу пробудить пользовательский поток, который будет считывать некоторые данные из модуля ядра через 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: Я вызываю эту функцию из контекста прерывания.
Спасибо! Можете ли вы объяснить, как реализовать такую вещь. или поделитесь ссылкой, чтобы понять это. –
@PankajGupta Объяснение, как это сделать с нуля, займет половина книги или больше. Я предлагаю вам получить книгу о написании драйверов устройств Linux. – msw