UNIX环境高级编程——文件I/O
3.1 文件描述符
作用:唯一表示一个文件(unix中设备也被看作文件)
当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
文件描述符的范围:0~OPEN_MAX-1
标准shell建立的文件描述符关联:
STDIN_FILENO (文件描述符:0):标准输入
STDOUT_FILENO (文件描述符:1):标准输出
STDERR_FILENO (文件描述符:2):标准错误
3.2 函数open和openat
利用open或openat函数可以打开或创建一个文件
#include<fcntl.h>
int open(const char *path, int oflag, ....);
int openat(int fd, const char *path, int flog, ....);
参数
path:
打开或创建的文件的名字
oflag:
oflag参数 | 功能 |
---|---|
O_RDONLY | 只读打开 |
O_WEONLY | 只写打开 |
O_RDWR | 读、写打开 |
O_EXEC | 只执行打开 |
O_SEARCH | 只搜索打开 |
O_APPEND | 每次写时都追加到文件末尾 |
O_CLOEXEC | 把FD_CLOEXEC设置为文件描述符标志 |
O_CREAT | 若文件不存在则创建它。open函数需要指定第3个参数mode(openat指定第四个参数mode),用来指定文件的权限位 |
O_DIRECTORY | 如果path引用的不是目录,则出错 |
O_EXCL | 如果同时指定了O_CREAT,而文件已经存在,则出错。 |
O_NOCTTY | 如果path引用的是终端设备,则不将该设备分配作为此进程的控制终端 |
O_NOFOLLOW | 如果path是一个符号链接,则出错 |
O_NONBLOCK | 如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式 |
O_SYNC | 使每次weite等待物理I/O操作完成,包括由该write操作引起的文件属性更新所需要的I/O |
O_TRUNC | 如果文件存在,并且为只写或读写成功打开,则将其长度截断为0 |
O_TTY_INIT | 如果打开一个还未打开的终端设备,设置非标准termios结构,使其符合Single UNIXSpecification |
O_DSYNC | 使每次write操作要等待物理I/O完成,但是如果该操作并不影响刚写入的数据,则不需要等待文件更新 |
O_RSYNC | 使每一个以文件描述符作为参数进行的read等待,直至所有对文件同一部分挂起的写操作完成 |
fd:
fd参数把open和openat区分开,共有三种可能性