目标:系统编程调用上次写好的“/dev/hello_dev”设备节点文件。
系统编程中不知道函数头文件的可以使用类似man 2 open
命令查询。
需要的头文件
- #include
// 调用打印的头文件,使用printf - #include <sys/types.h> // 基本数据类型头文件,使得基本数据长度在32位系统中以32位为基准,64位系统中以64位为基准
- #include <sys/stat.h> // 系统调用函数头文件。可以调用普通文件、目录、管道、socket、字符、块的属性。类似Windows下右键查看一个文件的属性。
- #include
// 定义了open函数 - #include
// 定义了close函数 - #include <sys/ioctl.h> // 定义了ioctl函数
我们已经把库函数放在了编译器目录的子目录下,找库函数的时候可以使用:
find ./ -name fcntl.h
查找结果如下(…/include/fcntl.h就是我们的目标文件):
编写系统应用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h> // 包含打印函数printf
#include <sys/types.h> // 一下基本数据类型的宏定义
#include <sys/stat.h> // 系统调用头函数
#include <fcntl.h> // 包含open函数
#include <unistd.h> // 包含close函数
#include <sys/ioctl.h> // 包含ioctl函数
int main(){
int fd;
char *hello_node = "/dev/hello_dev";
// 可读可写,非阻塞方式
if((fd = open(hello_node,O_RDWR|O_NDELAY)) < 0){
printf("App open %s failed\n",hello_node);
}
else{
printf("App oepn %s success\n",hello_node);
ioctl(fd,1,6);
}
close(fd);
return 0;
}
生成设备节点/dev/hello_dev后执行sys_hello结果如下,先打印内核信息,再打印系统应用信息:
事实上,设备节点其实可以在任何地方注册,不依赖于设备和驱动注册。也就是不一定非要在驱动probe函数中进行注册。如果裸生成设备节点,发现调用上述系统程序也是相同的效果。这是因为没有驱动数据的交流,设备节点注册部分一般还是放在驱动注册文件中,这样一些驱动注册中的变量可以在fops中使用。