我正在linux中编译一个与创建kthreads相关的内核模块以实现并行性,但我仍然困在编译问题。
这是我的代码:
#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);
我的代码存在的问题是,当我用make编译我的内核模块时,sys / wait.h会在linux / module.h和linux / kthread时给出编译错误,比如“重新定义一些strcut xyz”更多的错误.h也包括在内。一旦我注释掉这两个文件,该模块就可以很好地编译,但会给出一个链接错误,即“waitpid”未定义。
为什么sys / wait.h不能用linux / kthread.h和linux / module.h编译好?有没有人遇到过这个问题?
任何帮助将不胜感激。
答案 0 :(得分:3)
在内核代码中包含用户空间标头(如sys/wait.h
)是不正确的。