我在ubuntu 12.04下,已做了如下操作:
1. apt-get install kernel-package
2. 在 /usr/src/目录下安装 linux kernel 源码 apt-get install linux-source-3.2.0
3. 解压源码
4. 用make-kpkg 编译内核
5. 用dpkg 安装内核(deb文件)
6. 重启后版本显示是我新编译的没错
现在我想基于这个环境向内核加个模块写测试代码:
1. 在 /usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/ 下加个目录
2. 在新加的目录里加个 C 文件(测试代码,我想试一下 fork() 创建进程)
#include <linux/module.h>
#include <linux/init.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
MODULE_LICENSE("GPL");
static int guardhost_init(void);
static void guardhost_exit(void);
int main(void)
{
pid_t pc;
pc = fork();
if (pc < 0)
{
printk("guardhost: failed to create process!\n");
exit(1);
}
else if (pc > 0)
{
printk("guardhost: in parent process!\n");
}
else
{
printk("guardhost: in child process!\n");
}
return 0;
}
static int guardhost_init(void)
{
printk("guardhost_init called!\n");
return 0;
}
static void guardhost_exit(void)
{
printk("guardhost_exit called!\n");
}
module_init(guardhost_init);
module_exit(guardhost_exit);
3. 在新加的目录里加个Makefile
obj-m :=guardhost.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
4. cd 到测试代码所在目录,make,出错如下:
make -C /lib/modules/3.2.19rock.001/build M=/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost modules
make[1]: 正在进入目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0'
CC [M] /usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.o
/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.c:3:20: 致命错误: unistd.h:没有那个文件或目录
编译中断。
make[2]: *** [/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost/guardhost.o] 错误 1
make[1]: *** [_module_/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost] 错误 2
make[1]:正在离开目录 `/usr/src/linux-source-3.2.0/linux-source-3.2.0'
make: *** [all] 错误 2
root@rock-virtual-machine:/usr/src/linux-source-3.2.0/linux-source-3.2.0/drivers/guardhost#
提示找不到 unistd.h这个头文件,这个头文件不是内核自带的? 还需要什么库呢? 搜索整个内核代码,没见到哪里调用 fork() 函数的,fork() 不是用来创建进程的么,怎么会头文件找不到,也没见其它地方调用啊,怪异!!! 请高手帮忙解答一下吧,谢了!
菜鸟求助:编译时提示找不到 unistd.h
-
- 帖子: 13
- 注册时间: 2012-07-21 21:13
Re: 菜鸟求助:编译时提示找不到 unistd.h
是需要装什么库么,不使用fork()函数及那两个头文件时,编译没问题。。。
- 枫叶饭团
- 帖子: 14683
- 注册时间: 2010-06-16 1:05
- 系统: Mac OS X
- 来自: Tencent
- 联系:
Re: 菜鸟求助:编译时提示找不到 unistd.h
经常找不到头文件,要指定这指定那的。。。
- icelee123
- 帖子: 811
- 注册时间: 2011-07-16 19:48
- 系统: Arch
-
- 帖子: 13
- 注册时间: 2012-07-21 21:13
Re: 菜鸟求助:编译时提示找不到 unistd.h
有网友解释说是fork()函数属于应用层的API,不能在内核层使用,所以也就无法包含相应的头文件。我估计是这样原因,准备装个QT的库,在QT环境下试试看,谢谢各位的回复和无私的帮助啊,希望我的问题,也能给碰到同样问题的跟我一样的新手们一点帮助,大家一起努力!
- YeLee
- 论坛版主
- 帖子: 26406
- 注册时间: 2008-08-13 8:48
- 系统: Fundu i64
- 来自: 东海硇州,一双管钥。
- 联系:
Re: 菜鸟求助:编译时提示找不到 unistd.h
可有可无的东西,这个有必要吗?只拿需要的就可以了。另,glbc的开发包装全了吗?unicode版的?
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
-
- 帖子: 3
- 注册时间: 2010-06-04 9:46
Re: 菜鸟求助:编译时提示找不到 unistd.h
我在未使用新的内核前都可以正确使用,编译新的内核安装后,编译我自己的程序,提示需要线程库。
不知道有好的解决方法了
不知道有好的解决方法了