文件描述符:所有打开的文件通过文件描述符引用,文件描述符是一个非负整数。当打开或创建一个新文件时,内核向进程返回文件描述符。
1.open函数
int open(const char * 文件名,int oflag, (创建时使用第三个参数))
返回值:成功返回文件描述符,出错返回-1.
打开方式:
OFLAG:
1.O_RDONLY 只读
2.O_WRONLY 只写
3.O_RDWR 读写
上述常量三选一:
下列可选择的:
O_APPEND 每次写时追加到文件尾端。
O_TRUNC 如果文件存在将其截短为0。
O_CREAT 创建文件,使用此时,指定文件权限位。 文件权限位 & umask屏蔽字
2.lseek:每个打开打开的文件偏移量都与其关联的“当前文件偏移量”。通常是一个非负整数。
off_t lseek(int fileds, off_t offset, int whence )//文件标识符,偏移量, 以哪一种方式
返回值:成功返回新的文件偏移量,若出错返回-1.
int whence:
SEEK_SET 距离文件偏移量多少
SEEK_CUR 从当前位置加多少偏移量,可正可负。
SEEK_END 从文件长度增加偏移量 , 可正可负。
3.read函数:
SSIZE_T (int filedes, void *buf, size_t nbytes) //标识符,缓冲区(可以是堆或栈),读多大字节
返回值:若成功返回读到的字节,读到末尾返回0,失败返回-1.
4.write函数:
SSIZE_T (int filedes,void *buf,size_t nbytes)//标识符, 缓冲区, 写多少字节。
返回值:成功返回已写的字节数,失败返回-1.
5.close函数:
close(fd);
i/o效率:
1024 - 4096 比较好,4096为最佳。
文件共享:
进程表项:1024个字节,类似于结构体,里面有标记flag,还有指向文件表的指针。(给用户返回的是文件描述符)
文件表项:每打开一个文件就有1个文件表项和对应的V结点表项。(同一个文件打开多次有多个文件表),以打开次数为单位。
结构体成员:
1.文件打开方式(way)
2.偏移量(position)(从那里读,从那里写)
3.指针指向v结点表项
V节点表项:文件的信息。(长度,权限。。。)
原子操作:
一个函数就能搞定的。
所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束.
dup和dup2函数:
#include<unistd.h>
int dup(int oldfiledes)//标识符,当前可用最小文件描述符最为oldfd的赋值
返回值:返回当前可用文件描述符中的最小数值,出错返回-1.
int dup2(int oldfd, int newfd); //如果newfd被占用了,先关掉,让newfd作为oldfd的赋值。dup2能够指定fd给oldfd赋值
返回值:成功返回文件新的描述符,出错返回-1.
fcntl函数:
int fcntl(int fd, int cmd, /* int arg */)文件描述符, 功能描述符, 第三个参数是一个整数,指向结构体的指针。
fcntl函数的5种功能:
1.复制一个现有的描述符。(cmd = F_DUPFD)(很少用)
2.获得/设置文件描述标记。(cmd = F_GETFD / F_SETFD)
3.获得/设置文件状态标志。(cmd = F_GETFL / F_SETFL)
4.获得/设置异步i/o所有权 (cmd = F_GETOWN/F_SETOWN)
5.获得/设置记录锁 (cmd = F_GETLK/cmd = F_SETLK/ cmd = F_SETLKW)
原文:https://www.cnblogs.com/guohaohui/p/14546558.html