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缓冲区