Linux文件IO系统调用
Linux为用户提供了很多用于操作文件的系统调用api方便用户编写程序来操作文件。我们可以在linux中使用man手册来查看这些api的使用方法。
1. open
头文件
1 |
函数声明
1 | int open(const char *pathname, int flags); |
open函数会打开
pathname
所对应的文件,如果文件不存在,则可以通过在flags
中设置O_CREAT
选项来创建文件。open的返回值是文件的描述符(file descriptor, 一个用来标记文件的正整数),如果返回-1则表示打开/创建文件失败
- 常用的flag有:O_RDONLY, O_WRONLY, 以及O_RDWR用来声明文件权限。
2. close
头文件
1 |
函数声明
1 | int close(int fd); |
- 关闭文件标识符,当fd被关闭则无法再对文件标识符fd对应的文件进行操作。
3. read
头文件
1 |
函数声明
1 | ssize_t read(int fd, void *buf, size_t count); |
- read函数尝试从fd标识的文件中读取count字节的数据到buf中
- 当读取成功时,返回读取到数据的字节长度,文件指针的偏移改字节长度,通常用
while
循环读取文件。读取失败则返回-1.
示例
1 |
|
4. write
头文件
1 |
函数声明
1 | ssize_t write(int fd, const void *buf, size_t count); |
- write函数从buf中向fd标识的文件中写入最多count字节的数据
- 写入成功则返回写入的字节数目
实例(实现复制文件功能)
1 |
|
5.lseek
头文件
1 | #include <sys/types.h> |
函数声明
1 | off_t lseek(int fd, off_t offset, int whence); |
whence选项:
- SEEK_SET:将文件指针偏移量设置为offset
- SEEK_CUR:文件指针偏移量设置为SEEK_CUR + offset
- SEEK_END:文件偏移量设置为文件大小+offset
实例(忽略前32字节,复制部分内容)
1 |
|
6. stat函数
头文件
1 | #include <sys/types.h> |
函数声明
1 | int stat(const char *pathname, struct stat *statbuf); |
- stat返回一个文件的信息,将信息保存到statbuf这个结构体中
- lstat只返回符号链接的文件信息,而不返回所指向的文件信息
- stat和fstat区别在于参数
文件信息结构体
1 |
|
7. rename
头文件
1 | #include <stdio.h> |
函数声明
1 | int rename(const char *oldpath, const char *newpath); |
实例
1 |
|
8. getcwd
头文件
1 |
函数定义
1 | char *getcwd(char *buf, size_t size); |
- 将当前绝对路径传递给大小为size的buf
实例
1 |
|
9. mkdir&rmdir
头文件
1 | #include <sys/stat.h> |
函数声明
1 | int mkdir(const char *pathname, mode_t mode); |
- 创建文件夹,名字为pathname,读写权限用八进制数字mode标识(rwxrwxrwx)
- 删除文件夹
10. opendir
头文件
1 |
函数声明
1 | DIR *opendir(const char *name); |
实例(递归遍历获取文件个数)
1 |
|
11. dup
头文件
1 |
函数声明
1 | int dup(int oldfd); |
- 为一个文件复制一份新的文件描述符
- dup2可以指定文件标识符
1 |
|