文件I/O

函数

open函数oflag标志

符号 含义
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_EXEC 只执行打开
O_SEARCH 只搜索打开
O_APPEND 每次写时都追加到文件的尾端
O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志
O_CREAT 若此文件不存在则创建
O_DIRECTORY 如果引用的不是目录则出错
O_EXCL 如果同时指定了O_CREAT而文件已经存在,则出错
O_NOCTTY 如果引用的是终端设备,则不将该设备分配作为此进程的控制终端
O_NOFOLLOW 如果引用的是一个符号链接,则出错
O_NONBLOCK 如果引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则本次打开操作和后续的IO操作设置为非阻塞方式
O_SYNC 使每次write等待物理IO操作完成,包括由该write操作引起的文件属性更新所需的IO
O_TRUNC 如果此文件存在,而且为只写或读-写成功打开,则将其长度截断为0
O_TTY_INIT 如果打开一个未打开的终端设备,设置为非标准termios参数值
O_DSYNC 使每次write要等待物理IO操作完成,但是如果该写操作并不影响读取刚写入的数据,则不需要等待文件属性被更新
O_RSYNC 使每一个以文件描述符作为参数进行的read操作等待,直至所有对文件同一部分挂起的写操作都完成

由open和openat函数返回的文件描述符一定是最小的未用描述符数值

函数close

关闭一个文件时还会释放该进程加在该文件上的所有记录锁

函数lseek

#include 

off_t lseek(int fd, off_t offset, int whence);
  • 若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
  • 若whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可为正或负
  • 若whence是SEEK_END,则将该文件的偏移量设置为文件长度加offset,offset可正可负

lseek(fd, 0, SEEK_CUR); //确认打开文件的当前偏移量

这种方法也可用来确定所涉及的文件是否可以设置偏移量。如果文件描述符指向的是一个管道、FIFO或网络套接字,则lseek返回-1,并将errno设置为ESPIPE

函数read

有多重情况可使实际读到的字节数少于要求读的字节数
  • 读普通文件时,在读到要求字节数之前已达到文件尾端
  • 当从终端设备读时,通常一次最多读一行
  • 当从网络读时,网络中的缓冲机制可能造成返回值小于所要求读的字节数
  • 当从管道或FIFO读时,如若管道包含的字节少于所需的数量,那么read将只返回实际可用的字节数
  • 当从某些面向记录的设备读时,一次最多返回一个记录
  • 当一信号造成中断,而已经读了部分数据量时

函数sync、fsync和fdatasync

延时写:传统的UNIX系统实现在内核中设有缓冲区高速缓存或页高速缓存,大多数磁盘I/O都通过缓冲区进行。当我们向文件写入数据时,内核通常先将数据复制到缓冲区中,然后排入队列,晚些时间再写入磁盘

  • sync只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束
  • fsync函数只对由文件描述符fd指定的一个文件起作用,并且等待写磁盘操作结束才返回
  • fdatasync函数类似于fsync,但它只影响文件的数据部分

函数fcntl

描述符 含义
F_DUPFD 复制文件描述符fd
F_DUPFD_CLOEXEC 复制文件描述符,设置与新描述符关联的FD_CLOEXEC文件描述符标志的值
F_GETFD 对应于fd的文件描述符标志作为函数值返回
F_SETFD 对应fd设置文件描述符标志
F_GETFL 对应于fd的文件状态标志作为函数值返回
F_SETFL 将文件状态标志设置为第三个参数的值
F_GETOWN 获取当前接收SIGIO和SIGURG信号的进程ID或进程组ID
F_SETOWN 设置接收SIGIO和SIGURG信号的进程ID或进程组ID
文件状态标志 说明
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
O_ACCMODE 以上与操作
O_EXEC 只执行打开
O_SEARCH 只搜索打开目录
O_APPEND 追加写
O_NONBLOCK 非阻塞模式
O_SYNC 等待写完成(数据和属性)
O_DSYNC 等待写完成(数据)
O_RSYNC 同步读写
O_FSYNC 等待写完成
O_ASYNC 异步IO

函数ioctl

类别 常量名 头文件 ioctl数
盘标号 DIOxxx 4
文件I/O FIOxxx 14
磁带I/O MTIOxxx 11
套接字I/O SIOxxx 73
终端I/O TIOxxx 43

你可能感兴趣的:(Unix环境编程)