2010-11-06 8 views
0

Je suis en train de compiler un module noyau sous linux relatif à la création de kthreads pour atteindre le parallélisme mais je suis bloqué à la compilation des problèmes.sys/wait.h et sys/kthread.h ne compilent pas ensemble

Voici mon code:

#include <linux/init.h> 
#include <linux/errno.h> 
#include <asm/byteorder.h> 
#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/kthread.h> 
#include <linux/types.h> 
#include <sys/wait.h> 

void threadfn1() 
{ 
int j; 
for(j = 0; j < 1000000; j++) 
    printk(KERN_INFO "I AM THREAD 1 %d\n",j); 
} 

void threadfn2() 
{ 
int j; 
for(j = 0; j < 1000000; j++) 
    printk(KERN_INFO "I AM THREAD 2 %d\n",j); 

} 

static int __init abc_init(void) 
{ 
struct task_struct *t1 = kthread_run(threadfn1, NULL, "thread1"); 
struct task_struct *t2 = kthread_run(threadfn2, NULL, "thread2"); 

printk(KERN_INFO "HELLO WORLD\n"); 
waitpid(-1,NULL,0); // whatever the parameters of waitpid() are 
} 

static void __exit abc_fini(void) 
{ 
printk(KERN_INFO "BYE WORLD\n"); 
} 

module_init(abc_init); 
module_exit(abc_fini); 

Le problème avec mon code est que lorsque je compile mon module de noyau avec make, sys/wait.h donne compilant des erreurs comme « redéfinition de certains strcut xyz » Et de nombreux plus d'erreurs, lorsque linux/module.h et linux/kthread.h sont également inclus. Dès que je commente ces deux fichiers, le module se compile bien mais donne une erreur de liaison que "waitpid" n'est pas définie.

Pourquoi does sys/wait.h ne se compile pas avec linux/kthread.h et linux/module.h? Quelqu'un at-il déjà rencontré ce problème?

Toute aide serait appréciée.

+0

À quoi ressemble votre makefile? –

Répondre

3

Il est incorrect d'inclure des en-têtes d'espace utilisateur, tels que sys/wait.h, dans le code du noyau.

+0

Et incorrect d'appeler 'waitpid()' dans le noyau! – mpe

+0

alors quelles sont les alternatives de waitpid à utiliser dans l'espace noyau? –

+1

@Jewel Thief: Utilisez une complétion. Utilisez 'wait_for_completion()' dans la routine d'exit du module et utilisez 'complete_and_exit()' à la fin des fonctions de thread. – caf

Questions connexes