一. Linux 应用开发
1. 内容架构
1.1 硬件设备访问
1.2 多任务处理
1.3 网络编程
1.4 数据库编程
2. 硬件设备访问
我们知道 Linux 系统一切皆文件,所以硬件设备往往在Linux文件系统中会对应一个设备文件,我们是可以通过访问设备文件达到访问硬件设备的目的;
相关概念:
文件描述符: 本质:非负整数。linux系统会为被操作的文件进行一个编号,该编号用来唯一标识该文件,该编号就被称为该文件的文件描述符;
常用系统IO函数:
1. access
头文件:
#include <unistd.h>
#include <fcntl.h>
函数原型: int access(const char *pathname, int mode);
函数功能: 确认pathname 代表的文件/目录 是否存在或访问权限
函数参数:
pathname: 待确认的文件路径
mode: 判断模式,取值如下:
R_OK: 当前用户对文件的读权限
W_OK: 当前用户对文件的写权限
X_OK: 当前用户对文件的执行权限
F_OK: 文件是否存在
函数返回值:待确认的模式有效 返回0
否则返回 -1. 错误码存放在 errno
2. open
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: int open(const char *pathname, int flags);
int open(const char *pathname, int flags,mode_t mode);
函数功能: 打开/创建文件
函数参数: pathname: 待打开的文件路径
flags : 打开方式,取值分为两部分:
必选项:
O_RDONLY: 只读
O_WRONLY: 只写
O_RDWR: 读写
附加项:
O_APPEND 追加写
O_TRUNC 写前先清空原文件
O_CREAT 创建
mode: 如果指定创建标记,mode用来设置文件权限
函数返回值: 成功返回 文件描述符
否则返回 -1. 错误码存放在 errno
3. read
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: ssize_t read(int fd, void* buf,int count);
函数功能: 读取文件内容
函数参数: fd: 待读取的文件描述符
buf : 内存空间,用于存储读取到的内容:
count: 待读取的字节数
函数返回值: 成功返回 实际读取到的字节数
0: 读到文件末尾,或无数据可读
否则返回 -1. 错误码存放在 errno
4. write
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: ssize_t write(int fd, const void* buf,int count);
函数功能: 写入文件内容
函数参数: fd: 待写入的文件描述符
buf : 内存空间,用于存储要写入的内容:
count: 待写入的字节数
函数返回值: 成功返回 实际写入的字节数
否则返回 -1. 错误码存放在 errno
5. close
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: int close(int fd);
函数功能: 关闭文件,释放文件描述符
函数参数: fd: 待关闭的文件描述符
函数返回值: 成功返回 0
否则返回 -1. 错误码存放在 errno
6. lseek
头文件: #include <unistd.h>
#include <fcntl.h>
函数原型: off_t lseek(int fd,off_t off,int whence);
函数功能: 移动文件位置指针
函数参数: fd: 待操作的文件描述符
off: 文件位置指针相对偏移量
whence: 参考位置
函数返回值: 成功返回 当前位置指针距离文件头的偏移量
否则返回 -1. 错误码存放在 errno
7. mmap/munmap
头文件: #include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
函数原型: void* mmap(void* addr,int len,int prot,int flags,int fd,off_t off);
int munmap(void* addr,int len);
函数功能: 映射/解映射 文件到进程的地址空间
函数参数: addr: 需用户指定的映射地址,往往填 NULL 由系统决定
len: 映射/解映射 的地址空间大小(字节为单位)
prot: 为映射后的内存指定访问属性(要和文件的打开方式保持一致)
flags: 映射标记,标明该内存是否可被共享等
fd: 待关闭的文件描述符
off: 文件中映射内容相对文件头的偏移
函数返回值: 成功 munmap返回 0 mmap 返回实际映射的内存的首地址
否则 munmap返回 -1. mmap 返回 MAP_FAILED, 错误码存放在 errno
8. ioctl
头文件: #include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
函数原型: int ioctl(int fd,int request,...);
函数功能: 对fd 代表的文件/设备进行操作控制
函数参数: fd: 待操作的文件描述符
request: 基于设备的请求码
第三个参数: 视 request 而定,
函数返回值: 成功返回 0,少数request码会以返回值作为结果数据
否则返回 -1. 错误码存放在 errno
3. 文件状态信息获取
stat/ fstat
头文件: #include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
函数原型: int stat(const char* filepath,struct stat * si);
int fstat(int fd,struct stat * si);
函数功能: 文件状态信息获取
函数参数: fd: 待操作的文件描述符
filepath: 待操作的文件路径
si: [OUT] struct stat指针变量,用户存储获取的文件状态信息
函数返回值: 成功返回 0,
否则返回 -1. 错误码存放在 errno
4. 系统IO 和 标准 IO 区分:
1. 效率
系统IO会引起系统调用,系统调用是属于内核区操作,频繁的文件读取和写入造成程序在
内核代码区和用户代码区的频繁切换,影响系统性能,降低系统运行效率,
标准 IO 虽然最终也会引起系统调用,但是其采用了数据缓冲机制,频繁的文件读取和写入也
仅是在数据达到一定数量后进行一次系统调用,减少了内核代码区和用户代码区的切换频率,
可提升运行效率;
2. 跨平台使用
系统IO函数的使用是基于操作系统的,不同的操作系统提供的系统IO函数是不同的,所以基于某个
操作系统的系统IO函数使用,在其他平台上是不被支持的,也就造成了无法进行跨平台的使用,
标准 IO 提供了不同系统平台的统一标准接口,使得用户对标准IO的使用不必关注具体平台,
非常方便在不同平台的统一操作。