[a] open

#include <fcntl.h>
int open(const char *path, int oflag, ... ,mode_t mode)
  • 成功返回文件描术符, 失败返回 -1
  • oflag: O_RDONLY / O_WRONLY / O_RDWR / O_EXEC / O_APPEND / O_CLOEXEC / O_CREAT / O_EXCL / O_NONBLOCK / O_NOFOLLOW / O_SYNC / O_TRUNC / O_DSYNC ...
  • mode: 创建文件时賦予的初始权限, 可用数字表示, 如 0644 等

[b] creat

#include <fcntl.h>
int creat(const char *path, mode_t mode)
  • 等效于 open(path, O_RDWR|O_CREAT|O_TRUNC, mode)

[c] close

#include <unistd.h>
int close(int fd)
  • 成功返回 0, 出錯返回 -1

[d] lseek

#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence)
  • 成功返回新的文件偏移量,出錯返回 -1
  • offset: 以字节为单位的偏移量
  • whence: SEEK_CUR / SEEK_SET / SEEK_END
  • lseek 中的 l 是历史遗留问题, 指 long int
  • lseek(fd, 0, SEEK_CUR) 常用于确定已打开文件的当前偏移量
  • 偏移量超过文件末尾写数据, 会生成空洞, 空洞不占用磁盘空间

[e] read

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes)
  • 成功返回读到的字节数量, 若已到达文件末尾, 则返回 0, 出錯返回 -1
  • 尝试从 fd 中读取 nbytes 个字节到 buf 中, 有多种情况可使读到的字节数小于 nbytes

[f] write

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes)
  • 成功返回写入的字节数量, 出錯返回 -1
  • 若写入字节数与 nbytes 不同, 则表示出錯
  • 读写效率: 通常 buf 设为 PAGESIZE 或其整数倍时拥有最高的效率

[g] pread / pwrite

#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset)
ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset)
  • 返回值情况与 read / write 相同
  • 读写操作与定位文件偏移量是一个原子操作(atomic operation)
  • 不更新 SEEK_CUR 的值

[h] dup / dup2

#include <unistd.h>
int dup(int fd)
int dup2(int fd, int fd2)
  • 成功返回文件描述符, 出錯返回 -1
  • dup 返回的 fd 一定是当前可用 fd 中的最小值
  • 对于 dup2, 若 fd2 已经打开且不等于 fd, 将先关闭之, 再重新打开
  • 两个函数均会清除新打开的 fd 的 FD_CLOEXEC 标志

[i] sync / fsync / fdatasync

#include <unistd.h>
int fsync(int fd)
int fdatasync(int fd)
void sync(void)
  • 对于 fsync / fdatasync, 成功返回0, 出錯返回 -1
  • sync 只是将所有修改过的块緩冲排入写队列, 然后立即返回, 并不等待实际磁盘操作結束
  • fdatasync 只更新数据, 不更新文件属性, FreeBSD 不支持 fdatasync

[j] fcntl

#include <fcntl.h>
int fcntl(int fd, int cmd, ..., int arg)
  • 成功返回值因 cmd 而异, 出錯返回 -1
  • 共有 5 种功能:
    • 复制文件描述符, cmd=F_DUPFD / F_DUPFD_CLOEXEC, 成功返回新的文件描述符
    • 获取或设置文件描述符标志, cmd=F_GETFD / F_SETFD, 成功返回相应 fd flag, 通常以 1 或 0 表示 FD_CLOEXEC 标志位的启用与否
    • 获取或设置文件状态标志, cmd=F_GETFL / F_SETFL, 成功返回相应 file flag
    • 获取或设置异步 I/O 所有权, cmd=F_GETOWN / F_SETOWN, 成功时返数一个整数, 正数表示进程 ID, 負数表示进程組 ID
    • 获取或设置记录锁, cmd=F_GETLK / F_SETLK / F_SETLKW
  • F_GETFL 可用的标志有: O_RDONLY / O_WRONLY / O_RDWR / O_EXEC / O_APPEND / O_NONBLOCK / O_SYNC / O_DSYNC / O_ASYNC, 前 4 个标志的判断需要用现有的文件状态标志与 O_ACCMODE 进行 '&' 操作, 将結果与对应标志逐一比較, 其它标志可直接与对应标志进行 '&' 操作判断
  • F_SETFL 操作会清空原有的所有文件状态标志, 通常先用 F_GETFL 获取原有的值, 然后取新的标志与原有值 '|' 操作之后的結果, Linux 不允许在已打开的文件上更改 O_SYNC 标志

....

[03]APUE:文件 I/O的更多相关文章

  1. 【APUE | 03】文件I/O

    博客链接: inux中的文件描述符与打开文件之间的关系 #include <stdio.h> #include <unistd.h> #include <sys/stat ...

  2. APUE 文件IO

    文件 IO 记录书中的重要知识和思考实践部分 Unix 每个文件都对应一个文件描述符(file descriptor),为一个非负整数,一个文件可以有多个fd, 后面所有与文件(设备,套接字等)有关操 ...

  3. [APUE] 文件 I/O

    文件操作相关 API:open, read, write, lseek, close. 多进程共享文件的相关 API:dup, dup2, fcntl, sync, fsync, ioctl. 文件操 ...

  4. [apue] 文件中的空洞

    空洞的概念 linux 上普通文件的大小与占用空间是两个概念,前者表示文件中数据的长度,后者表示数据占用的磁盘空间,通常后者大于前者,因为需要一些额外的空间用来记录文件的某些统计信息或附加信息.以及切 ...

  5. [APUE]文件和目录(下)

    一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...

  6. [APUE]文件和目录(中)

    一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...

  7. [APUE]文件和目录(上)

    一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...

  8. 03 - Oracle文件概述

    构成Oracle数据库的8种文件类型. 可以把这些文件分成以下几类. Instance相关 参数文件 parameter, initOra file, spfile 跟踪文件 trace file 警 ...

  9. node(03 fs文件模块)

    我们通过读取一个文件内容并将内容写入到另外一个文件中. fs.createWriteStream 写入文件其实 这个可以看文档 参考这个更全一店 https://www.jianshu.com/p/d ...

随机推荐

  1. Python算法-冒泡排序

    #coding:utf-8 """ 冒泡排序 原理:依次重复访问每一个需要排序的元素,每次比较相邻的两个元素是否符合顺序,若不符合就交换,直到没有不符合顺序的为止. &q ...

  2. vim 大全用法

    vim中常用设置和操作: 在Linux系统下: 打开vi 文件: 0 数字0,跳转至行首    ^ 跳转至行第一个非空字符    $ 跳转至行尾 vim 括号匹配跳转操作: ctrl+] 跳转至函数或 ...

  3. Jmail发送邮件

    注册jmail windows --> 运行 --> cmd --> cd jmail目录 --> regsvr32 jmail.dll --> 注册成功 public ...

  4. VC++ MFC获取对话框上控件的位置

    CRect rect; GetDlgItem(控件ID)->GetWindowRect(&rect);//获取控件的屏幕坐标 ScreenToClient(&rect);//转换 ...

  5. 如何在cluster上跑R脚本

    R 是一个比较不错但是有时候操蛋的语言,不错是因为用着爽的时候真的很爽,操蛋是因为这种爽不是什么时候都可以的,比如说在cluster上批处理跑R脚本. 当然说这话有些在上面跑过的各种不服气,你丫傻逼吧 ...

  6. win7系统部分便笺的元数据已被损坏怎么恢复

    解决Windows7系统打开便笺:部分便笺的元数据已被损坏,便笺已将其恢复为默认值.这个问题! Windows7下有一部分系统打开便笺就会报出以下情况 其实这个方法很好解决! 我们需要重新注册一下下面 ...

  7. oracle 异常

    ORACLE 异常错误处理 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 ...

  8. TStringList的bug问题

    今天测试发现用TStringList进行字符分隔的时候 ,如果被分隔对象中含有空格就有产生发隔错误 方案一:可以用其它的函数来代替  方案二:Items.StrictDelimiter:= True;

  9. C++中类似C# region的功能

    使用#pragma region和#pragma endregion关键字,来定义可以展开和收缩的代码区域的开头和结尾, 可以把这些代码行收缩为一行,以后要查看其细节时,可以再次展开它. 例如: // ...

  10. Myeclipse2016部署tomcat服务(别的服务类似)配置环境

    1.在工具MyEclipse的项目管理菜单中,右单机找Properties或者快捷键alt+enter,(或者直接搜索Runtimes)myEclipse/Targeted Runtimes 2.ne ...