Привет!
Очередной нубовопрос: как можно из модуля ядра перезагрузить/выключить машину? Сейчас у меня на embedded устройстве есть такой велосипед:
static irqreturn_t power_interrupt(int irq, void *dummy)
{
struct task_struct *current_task = NULL;
if (__raw_readl(GPIO_P3_INP_STATE(GPIO_IOBASE)))
{
list_for_each_entry(current_task, &init_pid_ns.child_reaper->tasks, tasks)
{
if (strcmp(current_task->comm, APP1) == 0)
{
kill_proc_info(SIGTERM, SEND_SIG_PRIV, current_task->pids[PIDTYPE_PID].pid->numbers[0].nr);
printk(KERN_INFO "Power button: SIGTERM is sent to app.\n");
return IRQ_HANDLED;;
}
}
}
printk(KERN_INFO "Poweroff is coming.\n");
kill_proc_info(SIGUSR2, SEND_SIG_PRIV, 1);
return IRQ_HANDLED;
}
Логика тут следующая: попадаем в обработчик прерывания, которое срабатывает при нажатии на кнопку; на железе крутится программа APP1, которой шлем SIGTERM, а затем шлем SIGUSR2 процессу с пидом 1. Собственно пока я таким образом и выключаю девайс.
Есть ли более кошерные способы выключения? Как мне перезагрузить систему из модуля ядра?