Quiero llamar a un programa de espacio de usuario desde un módulo del núcleo periódicamente. Pero el programa del núcleo está congelando el sistema, mientras trato de cargarlo. el siguiente es el programa,
#include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO */ #include <linux/init.h> /* Needed for the macros */ #include <linux/jiffies.h> #include <linux/time.h> #include <linux/proc_fs.h> #include <asm/uaccess.h> #include <linux/hrtimer.h> #include <linux/sched.h> #include <linux/delay.h> #define TIME_PERIOD 50000 static struct hrtimer hr_timer; static ktime_t ktime_period_ns; static enum hrtimer_restart timer_callback(struct hrtimer *timer){ char userprog[] = "test.sh"; char *argv[] = {userprog, "2", NULL }; char *envp[] = {"HOME=/", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }; printk("\n Timer is running"); hrtimer_forward_now(&hr_timer, ktime_period_ns); printk("callmodule: %s\n", userprog); call_usermodehelper(userprog, argv, envp, UMH_WAIT_PROC); return HRTIMER_RESTART; } static int __init timer_init() { ktime_period_ns= ktime_set( 0, TIME_PERIOD); hrtimer_init ( &hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL ); hr_timer.function = timer_callback; hrtimer_start( &hr_timer, ktime_period_ns, HRTIMER_MODE_REL ); return 0; } static int __exit timer_exit(){ int cancelled = hrtimer_cancel(&hr_timer); if (cancelled) printk(KERN_ERR "Timer is still running\n"); else printk(KERN_ERR "Timer is cancelled\n"); } module_init(timer_init); module_exit(timer_exit); MODULE_LICENSE("GPL");test.sh es un script que solo hace eco de un comentario. He probado la parte call_usermodehelper y la parte del temporizador individualmente y funciona bien. Pero mientras estoy combinando los dos códigos, el sistema se bloquea. ¿Alguien puede ayudarme a resolver el problema?
Una mirada rápida sugiere fuertemente que las devoluciones de llamada de hrtimer se ejecutan desde un contexto irq, lo cual se espera: ¿de qué otra manera obtendrá una alta resolución?
Pero esto también significa que no debe bloquear, mientras que su devolución de llamada puede bloquearse debido a call_usermodehelper independientemente de que pase NOWAIT.
Entonces parece que está probando su módulo en un kernel con la depuración deshabilitada, lo cual es fundamentalmente incorrecto.
Pero esto es menos relevante ya que lo que está tratando de lograr en primer lugar parece fundamentalmente incorrecto.
Solo puedo recomendarle que elabore cuál es el problema real. Absolutamente ahora hay una forma en que bifurcar + ejecutar tiene algo que ver con algo que requiere un temporizador de alta resolución.