分页: 1 / 1

菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-07-27 14:02
hopstone
我在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() 不是用来创建进程的么,怎么会头文件找不到,也没见其它地方调用啊,怪异!!! 请高手帮忙解答一下吧,谢了!

Re: 菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-07-27 15:39
hopstone
难道大家都没碰到过这个问题么,还是说我的环境有问题?

Re: 菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-07-27 17:17
hopstone
是需要装什么库么,不使用fork()函数及那两个头文件时,编译没问题。。。

Re: 菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-07-27 17:26
枫叶饭团
经常找不到头文件,要指定这指定那的。。。

Re: 菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-07-27 17:48
icelee123
我的做法一般是locate一下 然后直接扔到/usr/lib里 :em06

Re: 菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-07-28 12:44
hopstone
有网友解释说是fork()函数属于应用层的API,不能在内核层使用,所以也就无法包含相应的头文件。我估计是这样原因,准备装个QT的库,在QT环境下试试看,谢谢各位的回复和无私的帮助啊,希望我的问题,也能给碰到同样问题的跟我一样的新手们一点帮助,大家一起努力!

Re: 菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-07-30 9:00
YeLee
可有可无的东西,这个有必要吗?只拿需要的就可以了。另,glbc的开发包装全了吗?unicode版的?

Re: 菜鸟求助:编译时提示找不到 unistd.h

发表于 : 2012-10-15 19:55
pleasure21cn
我在未使用新的内核前都可以正确使用,编译新的内核安装后,编译我自己的程序,提示需要线程库。
不知道有好的解决方法了