Linux编程入门-文件I/O
Linux编程入门-文件I/O
碎碎念
获取glibc版本:
1 |
|
错误处理:
1 | void perror (const char *__s); //打印错误信息 |
通用I/O模型
C语言标准中的文件操作这里略。
open
打开一个已存在的文件或创建并打开一个新文件:
1 |
|
新建文件的访问权限可能还受进程umask和父目录默认访问控制列表的影响。常用文件访问标志如下,其中前三个只能指定一种。
标志 | 含义 |
---|---|
O_RDONLY | 只读方式打开 |
O_WRONLY | 只写方式打开 |
O_RDWR | 读写方式打开 |
O_CLOEXEC | 设置close-on-exec标志 |
O_CREAT | 文件不存在则创建 |
O_DIRECTORY | 若不是目录则失败 |
O_EXCL | 当与O_CREAT结合使用时,若文件已存在则不打开文件并返回错误 |
O_NOCTTY | 若打开的文件为中断设备,则使其不要称为控制终端 |
O_NOFOLLOW | 不对符号链接进行解引用 |
O_TRUNC | 清空文件 |
O_APPEND | 文件尾追加数据 |
O_ASYNC | I/O操作可行时产生信号通知进程,略 |
O_DIRECT | 无系统缓冲 |
O_DSYNC | 提供同步的I/O数据完整性 |
O_NOATIME | read 时不修改文件最近访问时间 |
O_NONBLOCK | 非阻塞方式打开 |
O_SYNC | 同步方式写文件 |
O_PATH | 略 |
常见errno错误如下:
错误码 | 含义 |
---|---|
EACCES | 无法访问文件 |
EISDIR | 打开目录进行写操作 |
EMFILE | 进程已打开的文件描述符数达到进程资源限制上限 |
ENFILE | 文件打开数量达到系统允许的上限 |
ENOENT | 文件不存在且未指定创建标志,或指定路径目录不存在,或为空符号链接 |
EROFS | 文件隶属于只读文件系统,企图写打开文件 |
ETXTBSY | 所指定文件为正在运行的可执行文件,终止后即可 |
creat
创建并打开一个新文件,已被open
替代。
1 | int creat( //注意没有“e” |
read
从文件描述符指代的打开文件中读取数据:
1 |
|
write
将数据写入一个已打开的文件中:
1 | ssize_t write( |
close
关闭一个打开的文件描述符,释放回调用进程,供该进程继续使用。进程终止时自动关闭已打开的所有文件描述符。
1 | int close( |
lseek
调整文件偏移量。若某文件包含N字节数据,从0到N-1,则SEEK_SET为0,SEEK_END为N。
1 | __off_t lseek( |
常用参照基点如下:
基点 | 含义 |
---|---|
SEEK_SET | 文件头部 |
SEEK_CUR | 当前偏移量 |
SEEK_END | 文件尾部 |
当whence为SEEK_SET时offset必须为非负数,其他时可正可负。常见errno错误码有ESPIPE,表示lseek
不能应用于管道、FIFO、套接字或终端。
当往文件结尾后一段距离处写入数据时,中间的空间称为文件空洞,读取时返回空字节。
ioctl
用于通用模型以外的操作:
1 |
|
fcntl
对一个打开的文件描述符执行一系列控制操作:
1 | int fcntl( |
例如获取或修改打开文件的访问模式和状态标志,即在open
时设置的。
1 | int flags=fcntl(fd,F_GETFL),accessMode; |
dup/dup2
复制一个打开的文件句柄。其中0为标准输入流,1为标准输出流,2为标准错误流。系统保证返回新描述符一定是编号值最低的未用文件描述符。对于dup2
,当目标文件描述符已被占用,则自动先关闭再复制。当dup2
的fd无效,则返回EBADF,不关闭fd2。dup3
的flags常用值有O_CLOEXEC,含义为为新文件描述符设置close-on-exec标志。
1 | int dup( |
例如:
1 | //法一 |
pread/pwrite
再指定偏移量位置进行文件I/O操作,不改变文件当前偏移量:
1 | ssize_t pread( |
readv/writev
分别实现分散输入和集中输出,这俩都原子操作。
1 | struct iovec { |
preadv/pwritev
在指定文件偏移量处进行分散-集中I/O:
1 |
|
truncate/ftruncate
将文件大小设为指定值,不修改文件偏移量。
1 | int truncate( |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 The Blog of Monoceros406!