Je souhaite appeler périodiquement un programme d'espace utilisateur à partir d'un module noyau. Mais le programme noyau gèle le système, pendant que j'essaie de le charger. Voici le programme,Module de noyau appelant périodiquement le programme d'espace utilisateur
#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 est un script qui fait écho à un commentaire. J'ai testé individuellement la partie call_usermodehelper et la partie timer et cela fonctionne correctement. Mais pendant que je combine les deux codes, le système se bloque. Quelqu'un peut-il m'aider s'il vous plaît à résoudre le problème.
Vous appelez votre minuteur toutes les 50 minutes, êtes-vous sûr que c'est correct? Essayez avec une période d'une seconde ou plus, pour voir si cela fonctionne. – HappyCactus
Le rappel pour * hrtimer * est exécuté dans le contexte * atomic *, il ne devrait donc pas bloquer. 'call_usermodehelper' bloque le processus appelant jusqu'à ce que le programme appelle les retours. Vous pouvez utiliser 'delayed_work' au lieu de hrtimer pour exécuter périodiquement des tâches de blocage. – Tsyvarev
Oui .... call_usermodehelper bloque le code. Mais test.sh est juste un écho "testing". Aucune idée, alors qu'il n'en sort pas. – BusyTraveller