1.如何访问硬件设备应用程序无法直接访问硬件设备只能借助系统内核提供的系统调用接口来间接访问硬件设备。Linux 系统一切皆文件所以硬件设备访问即为文件操作。访问设备时首先找到系统中与设备对应的设备文件再借助系统IO访问硬件设备。2.关于文件描述符Linux程序中用文件描述符(fd)来标识一个文件文件描述符(fd)是一个文件的唯一标识本质是一个非负整数。linux系统中3个特殊的文件描述符0、1、2一个应用程序运行后,系统会为其自动打开0、1、2设备文件描述符。#define STDIN_FILENO 0 标准输入设备文件描述符 键盘#define STDOUT_FILENO 1 标准输出设备文件描述符 屏幕#define STDERR_FILENO 2 标准错误设备文件描述符3. 常用的系统IO函数3.1 access头文件: #include unistd.h#include fcntl.h函数原型 int access(const char* filepath, int mode);函数功能 确认文件是否存在及执行者操作权限函数输入型参数:filepath: 待操作的文件/目录mode确认模式F_OK: 文件是否存在R_OK当前用户是否有读权限W_OK当前用户是否写权限X_OK当前用户是否执行权限返回值: 待确认的模式满足返回 0否则 返回-1 错误码放在 errnoeg access(./text,F_OK);3.2 open头文件: #include unistd.h#include fcntl.h函数原型 int open(const char* filepath, int flags);int open(const char* filepath, int flags, mode_t mode);函数功能 打开/创建文件获取文件描述符函数输入型参数:filepath: 待操作的文件flags 操作模式必选项O_RDONLY: 只读O_WRONLY只写O_RDWR 读写附件项O_APPEND: 追加写O_CREAT: 创建O_TRUNC: 覆盖写...mode: 指令新创建文件的访问权限参数返回值: 成功返回 文件描述符否则 返回-1 错误码放在 errnoeg open(./text.txt,O_WRONLY | O_CREAT, 0664);3.3 read头文件: #include fcntl.h#include unistd.h函数原型: ssize_t read(int fd,void *buf, size_t size);函数功能 从文件中读取文件内容函数输入型参数fd 待操作文件描述符size 内存缓冲区长度函数输出型参数buf已申请的内存缓冲区用来存储读取到的文件内容函数返回值 成功返回 0 是读取到文件末返回0的数是实际读取到的字节数失败 返回-1 错误码存在errno3.4 write头文件: #include fcntl.h#include unistd.h函数原型: ssize_t write(int fd,const void *buf, size_t size);函数功能 向文件中写入数据函数输入型参数fd 待操作文件的描述符buf来存储要写入的文件数据size文件数据的长度函数返回值成功返回实际写入的字节数失败 返回-1 错误码存在errno3.5 close头文件 #include fcntl.h#include unistd.h函数原型: int close(int fd);函数功能 关闭文件释放文件描述符函数输入型参数 fd 待操作文件的描述符函数返回值成功 返回0失败 返回-1 错误码存在errno3.6 lseek头文件 #include fcntl.h#include unistd.h函数原型 off_t lseek(int fd, off_t offset, int whence)函数功能 移动文件指针函数输入型参数 fd要操作的文件描述符offset相对于whence参考位置的偏移量whence参考位置可取以下值SEEK_SET: 文件头部SEEK_CUR: 当前位置SEEK_END: 文件末尾返回值 成功返回文件指针的偏移量出错返回 -1并将错误码存入 errno 中3.7 mmap munmap头文件 #include sys/mman.h函数原型 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *addr, size_t length);功能 映射/解除映射 文件存储空间到进程的虚拟地址空间函数输入型参数:addr映射的地址空间首地址NULL 表示让系统决定length地址空间大小prot映射的地址空间访问方式必须和文件打开方式匹配flags: 映射的地址空间的访问标记fd: 需映射的文件描述符offset: 文件存储空间的偏移量注prot,flags参数相见手册man mmap返回值 成功munmap返回 0 ,mmap 返回映射后的地址出错返回 MMAP_FAILED并将错误码存入 errno 中3.8 stat头文件 #include fcntl.h #include unistd.h#include sys/types.h #include sys/stat.h函数原型 int stat(const char *path, struct stat* buf)int fstat(int fd, struct stat *buf);功能 获取文件状态函数输入型参数:path要操作的文件名或路径fd文件描述符函数输出型参数:buf指向stat 结构体的指针用来获取文件状态信息注struct stat 详细参考手册man statstat 函数用来获取未打开的文件状态信息fstat 函数用来获取打开的文件状态信息返回值: 成功返回 0出错返回 -1并将错误码存入 errno 中3.9 Ioctl头文件 #include sys/ioctl.h函数原型int ioctl(int fd, unsigned long request, void * pointer, ...)功能控制设备的函数操作设备底层参数获取或设置函数输入型参数fd: 已打开的设备文件描述符requst: 请求编码依赖设备函数输入/输出型参数pointer void * 参数取值依赖request获取数据时它作输出型参数修改数据时它作输入型参数返回值: 成功返回 0出错返回 -1并将错误码存入 errno 中