首页 > 代码库 > 《UNIX环境高级编程》读书笔记 —— 文件 I/O
《UNIX环境高级编程》读书笔记 —— 文件 I/O
一、打开或创建一个文件
#include <fcntl.h>int open(const char *pathname, int oflag, .../*mode_t mode*/);
返回值:若成功则返回文件描述符,若出错则返回-1
oflag选项:
O_RDONLY
O_WRONLY
O_RDWR
以上三个常量中必须指定一个,且只能指定一个。
以下常量都是可选的:
O_APPED 每次写时追加到文件尾
O_CREAT 若文件不存在,则创建
O_EXCL 若同时指定了O_CREAT,而文件已经存在,则出错;否则创建文件
O_TRUNC 若文件存在且为只写或读写打开成功,则讲文件截断为0
O_NOCTTY
O_NONBLOCK 若pathname指定的是一个FIFO、一个快特殊文件或者一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非组赛模式。
O_DSYNC 每次write都等待物理I/O完成,但不等待文件属性更新
O_RSYNC
O_SYNC 每次write都等待物理I/O完成,包括write引起的文件属性更新所需的I/O
#include <fcntl.h>
int create(const char *pathname, mode_t mode);
返回值:若成功则返回为只写打开的文件描述符,若出错则返回-1
该函数等效于:
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)
二、关闭一个打开的文件
#include <unistd.h>int close(int filedes);
返回值:若成功则返回0,若出错则返回-1
关闭一个文件时还会释放该进程在该文件上的所有加锁。
当一个进程结束时,内核会自动关闭它所有打开的文件。
三、为一个打开的文件设置偏移量
#include <fcntl.h>off_t lseek(int filedes, off_t offset, int whence);
返回值:若成功则返回新的文件偏移量,若出错则返回-1
whence取值:
SEEK_SET 将文件偏移设置为距文件开始处offset个字节
SEEK_CUR 将文件偏移设置为当前值加offset,offset可为正或负
SEEK_END 将文件偏移设置为文件长度加offset,offset可为正或负
管道、FIFO和网络套接字不可设置偏移量
四、文件读写
#include <unistd.h>ssize_t read(int filedes, void *buf, size_t nbytes);
返回值:若成功则返回读到的字节数,若已到文件尾则返回0,若出错则返回-1
#include <unistd.h>
ssize_t write(int filedes, void *buf, size_t nbytes);
返回值:若成功则返回已写的字节数,若出错则返回-1
五、文件共享
六、复制文件描述符
#include <unistd.h>int dup(int filedes);
int dup2(int filedes, filedes2);
返回值:若成功返回新的文件描述符,若失败返回-1
dup返回的是当前可用的最小的文件描述符
dup2则返回filedes2所指定的文件描述符,若filedes2已经存在,则先将其关闭
七、文件同步
#include <unistd.h>int fsync(int filedes);
int fdatasync(int filedes);
void sync();
sync 该函数只是将所有修改过的块缓存加入写队列,并不等真正的写磁盘结束就返回,系统update守护进程会定期(30秒)调用该函数
fsync 只针对filedes描述符起作用,并且等待写磁盘操作结束然后返回
fdatasync 类似于fsync,但它只影响文件的数据部分,不同步更新文件属性
#include <fcntl.h>
int fcntl(int filedes, int cmd, .../* arg */);
返回值:若成功则依赖于cmd,若失败则返回-1
八、文件控制
fcntl的5种功能:
复制一个现有的描述符 cmd = F_DUPFD获得/设置文件描述符标记 cmd = F_GETFD / F_SETFD
目前只有一个标志:FD_CLOEXEC
获得/设置文件状态标记 cmd = F_GETFL / F_SETFL
文件状态标志:O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_APPEND *每次写时追加
O_NONBLOCK *非阻塞模式
O_SYNC *等待写完成(数据和属性)
O_DSYNC *等待写完成(仅数据)
O_RSYNC *同步读、写
O_FSYNC *
O_ASYNC *
加*号的为F_SETFL所能修改的
获得/设置异步I/O所有权 cmd = F_GETOWN / F_SETOWN
获得/设置记录锁 cmd = F_GETLK / F_SETLK / F_SETLKW
#include <unistd.h>
int ioctl(int filedes, int request, ...);
返回值:若出错返回-1,成功返回其他返回值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。