Linux 文件I/O 及其 多个相关函数
1、文件描述符
每个文件描述符对应一个指针,该指针指向一个结构体,里面存储了 已打开 的文件的描述信息。文件描述符和结构体指针的对应关系是使用哈希映射得到的。
2、函数open
和 openat
调用open
或 openat
函数可打开或创建一个文件,两函声明义如下:
#include<fcntl.h>
int open(const char* path, int oflag, ... /* mode_t mode */);
int openat(int fd, const char* path, int oflag, ... /* mode_t mode */);
返回值说明:
若函数执行成功,返回文件描述符,失败返回-1。
参数说明:
① path
:
是要打开或创建文件的路径。
② oflag
:
用来说明此函数的多个选项,用下面一个或多个常量进行 “或” 运算,构成oflag
参数。
③ fd
:
fd
参数把open
和 openat
函数区分开,共有三种可能性:
path
参数指定的是绝对路径名,此时,fd
参数被忽略,openat
相当于open
path
指定的是相对路径名,fd
参数指出相对路径名在文件系统中的开始地址(fd
和path
合起来,共同构成一个绝对路径)。fd
参数是在 调用openat
前,通过打开相对路径名所在的目录来获取的。path
参数指定相对路径名,fd
参数具有特殊值AT_FDCWD
。这时,路径名在当前工作目录中获取,openat
函数在操作上与open
函数类似。
④ 最后一个参数...
最后一个参数写作...
,表示参数的数量及类型是可变的。对于open
函数而言,仅当创建新文件时才使用最后这个参数,它用于指定文件的访问权限位。
3、函数read
read
函数用于从打开文件中读取数据:
#include<unistd.h>
ssize_t read(int fd, void* buf, size_t nbytes);
返回值说明:
返回读到的字节数,若已到文件尾,返回0,出错返回-1。
参数说明:
① fd
要读取的文件描述符
② buf
读出数据的缓冲区。是个指针,指向存放读出数据的气势内存空间。
③ nbytes
读取的字节数
其他说明:
4、fcntl
函数 file control
fcntl
函数可以控制一个文件描述符的行为,如:复制,改变属性等:
#include<fcntl.h>
int fcntl(int fd, int cmd, ...)
参数说明:
fd
:我们想要操作的文件描述符cmd
:想要执行的操作,共有11种,如下所示:...
:最后一个参数是个可选项,会随着第二个参数而改变
返回值:
返回值随fcntl
函数第二个参数的不同而不同。
详细用法直接去参考《UNIX环境高级编程》3.14小节。