1. Linux系统IO函数
-
open函数
// 打开文件(存在) 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_CREAT: 文件如果不存在, 创建新文件 O_EXCL: 检测打开的文件是否存在, 必须和O_CREAT一起使用 - 创建的文件的时候检测文件是否存在 - 不存在, 创建 - 存在, 函数调用失败 - mode: 创建的文件的权限, 八进制数 0777 最终权限: (mode & ~umask) 返回值: 成功: 打开的文件的文件描述符 , 失败: -1
-
close函数
#include <unistd.h> // 参数是open的返回值 int close(int fd);
-
read函数
ssize_t read(int fd, void *buf, size_t count); 参数: - fd: open之后得到返回值 == 文件描述符 - buf: 存储从文件中读出的数据, 数组的地址 - count: buf的最大容量, 计算方式: sizeof(buf) 返回值: 失败: -1 成功: >0: 返回值读到的字节数 ==0: 文件读完了
-
write函数
ssize_t write(int fd, const void *buf, size_t count); 参数: - fd: open之后得到返回值 == 文件描述符 - buf: 要写入到文件中的数据 - count: buf中数据的长度, strlen(buf) 返回值: 失败: -1 成功: >0: 成功写入到文件中的字节数 ==0: 往文件中写入了0字节
-
lseek函数
#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence); 参数: - fd: open之后得到返回值 == 文件描述符 - offset: 偏移量 - whence: 宏, 控制偏移量如何使用 SEEK_SET: 从文件头偏移 offset 个字节 SEEK_CUR: 偏移量 = 文件指针当前位置 + 参数offset SEEK_END: 偏移量 = 文件大小 + 参数 offset 返回值: 成功: 最终得到的偏移, 失败: -1
-
truncate/ftruncate函数
#include <unistd.h> #include <sys/types.h> // 文件拓展或截断 int truncate(const char *path, off_t length); - path: 操作的磁盘文件 - length: 文件的最终大小 length>原大小 -> 文件拓展 length<原大小 -> 文件截断 int ftruncate(int fd, off_t length);
2. 其他系统函数
2.1 stat函数
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
struct stat{}
int stat(const char *pathname, struct stat *buf);
参数:
- pathname: 要操作的文件名字
- buf: 传出参数
返回值: 成功0, 失败-1
2.2 目录遍历函数
-
opendir/closedir函数
#include <dirent.h> // 打开目录 // 参数: name: 要打开的目录的名字 // 返回值: 目录指针, 如果失败返回NULL DIR *opendir(const char *name); // 关闭目录 int closedir(DIR *dirp); //参数是 opendir 的返回值
-
readdir函数
#include <dirent.h> struct dirent { ino_t d_ino; /* 通过这个变量找到文件在磁盘位置 */ off_t d_off; /* 偏移量, 用不到 */ unsigned short d_reclen; /* 变量d_name中存储的实际数据长度 */ unsigned char d_type; /* 当前文件的类型 */ char d_name[256]; /* 当前文件的文件名 */ }; /*文件类型 d_type : DT_BLK This is a block device. DT_CHR This is a character device. DT_DIR This is a directory. DT_FIFO This is a named pipe (FIFO). DT_LNK This is a symbolic link. DT_REG This is a regular file. DT_SOCK This is a UNIX domain socket. DT_UNKNOWN The file type is unknown.*/ // 参数: dirp: opendir 的返回值 // 返回值: 结构体, 这个结构体对应读到的目录中的磁盘文件 // 目录中一般是有多个文件的, 如果想全部读出, 需要遍历, 遍历当前目录需要循环处理 // 如何知道目录中的所有文件遍历完了, 如果readdir 返回NULL, 代表遍历完成 struct dirent *readdir(DIR *dirp);
2.3 其他函数
-
dup函数---->复制文件描述符
// 参数 oldfd 被复制的文件描述符 // 返回值: 新的文件描述符 // 参数oldfd和返回值得到的newfd可以操作同一个磁盘文件 int dup(int oldfd);
-
dup2函数
int dup2(int oldfd, int newfd); 场景1:(最常用) oldfd -> 对应打开的磁盘文件a.txt newfd -> 对应打开的磁盘文件b.txt 这中情况下重定向: newfd和b.txt断开, b.txt打开的文件关闭, newfd指向 a.txt 场景2: oldfd -> 对应打开的磁盘文件a.txt newfd -> 不执行任何的磁盘文件 这中情况下文件描述符复制: newfd指向 a.txt 场景3: oldfd和newfd 都指向 a.txt, 相当于什么也没做
-
fcntl函数
int fcntl(int fd, int cmd, ... /* arg */ ); 参数: - fd: 被操作的文件描述符 - cmd: 要实现什么功能, 需要指定提供的宏值 // 复制文件描述符 cmd: F_DUPFD -> 复制文件描述符 int newfd = fcntl(fd, F_DUPFD); // 修改文件描述符对应的flag属性(最常用的情况) cmd: F_GETFL -> 得到文件描述符的flag属性 int flag = fcntl(fd, F_GETFL); F_SETFL -> 将新的flag属性设置给文件描述符 flag = flag | O_APPEND; fcntl(fd, F_SETFL, flag);
fcntl函数常用于为文件描述符添加非阻塞属性