文件I/O

本文介绍了Linux系统中关于文件I/O的各种函数,包括open函数的oflag标志、close函数在关闭文件时释放记录锁的功能、lseek函数对文件偏移量的操作、read函数可能出现的读取字节数少于请求的情况,以及sync、fsync和fdatasync在同步数据到磁盘方面的区别。还提到了fcntl和ioctl函数在文件控制和I/O控制中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数

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 <unistd.h>

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<sys/disklabel.h>4
文件I/OFIOxxx<sys/filio.h>14
磁带I/OMTIOxxx<sys/mtio.h>11
套接字I/OSIOxxx<sys/sockio.h>73
终端I/OTIOxxx<sys/ttycom.h>43
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值