Linux open fopen fdopen

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
以下三个常量中必选一个:
O_RDONLY	//只读模式
O_WRONLY	//只写模式
O_RDWR	//读写模式
以下常量选用:
O_APPEND	//每次写操作都写入文件的末尾
O_CREAT	//如果指定文件不存在,则创建这个文件
O_EXCL	//如果要创建的文件已存在,则返回-1,并且修改errno的值
O_TRUNC	//如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY	//如果路径名指向终端设备,不要把这个设备用作控制终端
O_NONBLOCK	//如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O
以下三个常量同样是选用的,它们用于同步输入输出:
O_DSYNC	//等待物理I/O结束后再write。在不影响读取新写入的数据的前提下,不等待文件属性更新
O_RSYNC	//read等待所有写入同一区域的写操作完成后再进行
O_SYNC	//等待物理I/O结束后再write,包括更新文件属性的I/O

open返回的文件描述符一定是最小的未被使用的描述符

参数mode 组合
S_IRWXU		//00700权限,代表该文件所有者具有可读、可写及可执行的权限
S_IRUSR或S_IREAD		//00400权限,代表该文件所有者具有可读取的权限
S_IWUSR或S_IWRITE	//00200权限,代表该文件所有者具有可写入的权限
S_IXUSR或S_IEXEC		//00100权限,代表该文件所有者具有可执行的权限
S_IRWXG		//00070权限,代表该文件用户组具有可读、可写及可执行的权限
S_IRGRP		//00040权限,代表该文件用户组具有可读的权限
S_IWGRP		//00020权限,代表该文件用户组具有可写入的权限
S_IXGRP		//00010权限,代表该文件用户组具有可执行的权限
S_IRWXO		//00007权限,代表其他用户具有可读、可写及可执行的权限
S_IROTH		//00004权限,代表其他用户具有可读的权限
S_IWOTH		//00002权限,代表其他用户具有可写入的权限
S_IXOTH		//00001权限,代表其他用户具有可执行的权限
creat(const char* pathname, mode_t mode);
open和creat区别:
creat()创建文件,总会运行成功
creat()创建已存在的文件,并不会更改原文件的属性

O_APPEND
含义是在每次写之前,都将标志位移动到文件的末端

int fd = open("test.txt", RDWR | O_APPEND);
lseek(fd, 10, SEEK_SET);

这里lseek是没有用的

转换

FILE *fp = fopen("test.txt", "r");
int fd = fileno(fp);

寻找文件流使用的是哪个底层文件描述符。进行底层访问操作(比如想对他调用fstat)

FILE *fdopen(int fd, const char *mode);

根据文件描述符创建文件流。为一个已经打开的文件描述符提供一个stdio缓冲区

原文地址:https://www.cnblogs.com/zhangxuechao/p/11709938.html