1、文件描述符:
是已打开的文件的标志,是一个非负整型数,当前可用最小作为新打开文件的文件描述符,范围默认是0 ~1024。
2、文件的打开:
int open(const char *path, itn flag,int mode);
path:要打开文件的路径。
flag:打开方式。 包括 O_RDONLY / O_WRONLY / O_RDWR 这三个必选一个。
O_CREAT / O_TRUNC / O_APPEND 创建,截断和追加
mode:文件不存在需要创建文件时,mode是设置的权限 创建的文件实际的权限 = mode & ~umask 只有
返回值:成功返回文件描述符, 失败返回 -1 并且会设置errno的值。
3、读文件:
ssize_t read(int fd,void *buf, int size);
fd: 待读取的文件的文件描述符。
buf: 存储读到的数据。
size: buf的大小(BUFSIZE)
返回值: 成功返回读到的字节个数,失败返回 -1 如果返回值是0,就说明读到了文件的末尾。
4、写文件:
int write(int fd, const void *buf, int size);
fd: 要写入的文件
buf: 存储待写入的数据
size :待写入的字节个数(读到多少写多少)
返回值:成功返回写入的字节个数,失败返回-1
5、设置文件的偏移量:
int lseek(int fd, offset_t n, int whence);
fd : 要给哪个文件设置偏移量
n: 要偏移的字节个数
whence: 从文件的哪个位置开始偏移。
返回值:返回当前文件的偏移量。
6、关闭文件:
int close(int fd);
fd:要关闭的文件的文件描述符。
7、IO效率:
read 和 write函数的第二个参数(buf (BUFSIZE)),BUFSIZE的大小选择1024~4096 这个区间是最优的。
8、文件共享:
UNIX系统支持在不同进程间共享打开的文件。
进程表项 : 包括文件状态标志,一个指针(指向文件表项)
文件表项 : 只有打开文件时才有,一个文件打开一次就会有一个文件表项,同一个文件打开多次也会有多个文件表项。
文件表项也是 一个结构体类型,文件表项里有这样几个成员:①文件的打开方式(只读、只写、读写)②文件的偏移量。 ③一个指针 (指向V结点表项)
V结点表项:V结点表项当中存放的是一些文件的信息,如文件的长度,权限等等。
进程表项里有一个指针,这个指针指向文件表项,而文件表项里有一个V结点指针,它将指向对应的V结点表项。
给我们用户返回的是进程表项这个数组的下标值,我们将这个下标值称为文件描述符
9、文件描述符的复制(重定向)
① int dup(int oldfd); 当前可用最小的文件描述符作为oldfd的复制。
② int dup2(int oldfd, int newfd); 如果newfd被占用了,就先关闭newfd,再作为oldfd的复制
10、fcntl(int fd,int cmd,)能够改变已打开文件的性质 只有在设置的时候才有第3个参数,获得是没有的。
五个功能:
①复制一个现有的文件描述符
②获得/设置文件描述符标记
③获得/设置文件状态标志
④获得/设置异步IO所有权
⑤获得/设置记录锁
cmd 值的种类:(共有10 种) F_DUPFD —— 复制文件描述符,新文件描述符作为返回值返回
O_NONBLOCK —— 非阻塞模式。
原文:https://www.cnblogs.com/HXH21/p/14633895.html