8_编写系统程序调用驱动

编写一个控制台应用进行控制底层设备

Posted by Jerry Chen on June 21, 2019

目标:系统编程调用上次写好的“/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中使用。