文件IO学习笔记
1. 文件描述符:所有打开的文件都通过文件描述符引用.
文件描述符0与进程的标准输入关联
文件描述符1与进程的标准输出关联
文件描述符2与进程的标准错误关联
2. 函数open
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, node_t mode);
node: (1) flags参数用一个或者多个常量进行或运算.
(2) O_RDONLY 只读打开, O_WRONLY 只写打开, O_RDWR 读,写打开, O_EXEC 只执行打开, O_SEARCH 只搜索打开(应用于目录), 这五个参数必须且只选择一个.
O_APPEND 追加, O_CREAT 创建等是可选项.
3. 函数close
int close(int fd);
4. 函数lseek
off_t lseek(int fd, off_t offset, int whence);
note: (1) 如果成功返回新的文件偏移量,若失败返回-1
(2) 当打开一个文件时,除非指定O_APPEND选项,否则偏移量被设置为0.
(3) 若whence是SEEK_SET, 则将该文件的偏移量设置为距文件开始offset个字节.
若whence是SEEK_CUR, 则将该文件的偏移量设置为当前值加offset, offset可为正或负.
若whence是SEEK_END, 则将该文件的偏移量设置为文件长度加offset, offset可正可负.
5. 函数read
ssize_t read(int fd, void *buf, size_t count);
note: (1) 成功返回读到的字节数, 若以到文件尾返回0, 出错返回-1.
(2) 多种情况下可导致实际读到的字节数少于要求读的字节数.例..要求读100字节,但到文件尾端只有30个字节,则返回30.
6. 函数write
ssize_t write(int fd, void *buf, size_t count);
note: (1) 成功返回写入的字节数,失败返回-1.
7. 文件共享
(1) 内核使用三种数据结构表示打开文件: 进程表项, 文件表项, v结点表项
(2) 每个进程在进程表中都有一个记录项, 记录项包含一张打开的文件描述符, 与每个文件描述符相关联的是文件描述符标志, 和指向一个文件表项的指针.
(3) 内核为所有打开的文件维持一张文件夹, 每个文件表项包含文件状态标志, 当前文件偏移量和指向该文件v结点表项的指针.
(4) 每个打开文件(或设备)都有一个v结点结构, 包含文件类型和对此文件进行各种操作函数的指针.
8. 原子操作
note: (1) 原子操作指的是由多步操作组成的一个操作.要么执行完所有的操作步骤, 要么一步也不执行.
(2) 追加到一个文件的原子操作:打开文件时设置O_APPEND标志.
9. 函数dup(), dup2()
int dup(int fd);
int dup2(int fd, int fd2);
note: (1) 成功返回新的文件描述符, 失败返回-1.
(2) dup返回的新的文件描述符一定是当前可用文件描述符的最小数值.
(3) dup2函数可以用fd2参数指定新描述符的值. 如果fd2已经打开, 则先将其关闭. 如果fd等于fd2, 则dup2返回fd2, 而不关闭它. 否则, fd2的FD_CLOEXEC文件描述符标志就被清除, 这样fd2在进程调用exec时打开状态.
10. 函数fcntl
int fcntl(int fd, int cmd,.../* int arg */);
note: (1) 复制一个已有的文件描述符(cmd = F_DUPFD, 或F_DUPFD_CLOEXEC)
(2) 获取/设置文件描述符标志(cmd = F_GETFD or cmd = F_SETFD).
(3) 获取/设置文件状态标志(cmd = F_GETFL or cmd = F_SETFL).
(4) 获取/设置异步I/O所有权(cmd = F_GETOWN or cmd = F_SETOWN).
(5) 获取/设置记录锁(cmd = F_GETLK, F_SETLK or cmd = F_SETLKW).
转载于:https://www.cnblogs.com/frank-zhao19/p/10550160.html