Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

190
Vistas
Módulo del núcleo llamando periódicamente al programa de espacio del usuario

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?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda