Linux环境编程笔记--文件IO

学习笔记 专栏收录该内容
5 篇文章 0 订阅

最近在看Allen大神的Linux环境编程系列博客,把自己认为重要的东西记录下来,以供日后学习使用。

1、文件描述符

open函数返回的整数,即PCB中文件列表的索引值。
文件列表中存储指向struct file的指针,struct file存储着关于此文件的一些操作和存储参数,其中,f_count是文件同时使用数量,为0之前对此文件的close操作都是count--,并不是真正关闭文件
文件列表中存储指向struct file的指针,struct file存储着关于此文件的一些操作和存储参数,其中,f_count是文件同时使用数量,为0之前对此文件的close操作都是count–,并不是真正关闭文件。

2、lseek()函数

函数原型:off_t lseek(int fd, off_t offset, int whence);
函数作用:改变f_pos指针位置。f_pos的位置决定了对此文件进行读写的初始位置。
参数作用:当用 open 函数打开一个文件的时候,该偏移量 f_pos 被默认指定为 0。

如果 whence 等于 SEEK_SET,则 f_pos = offset(offset 只能是正数)
如果 whence 等于 SEEK_CUR, 则 f_pos = f_pos + offset(offset 可正可负)
如果 whence 等于 SEEK_END,则 f_pos = 文件长度 + offset (offset 可正可负)

3、阻塞与非阻塞IO

通常read()一个文件,函数会在有限时间内返回,但是如果是从键盘或者网络读数据,则有可能会出现等待数据输入的现象,这时,read线程便会被系统休眠,直至有数据进来将其唤醒。这种现象叫做block,write同理。
如果在单线程中进行从两个设备中读取数据,则前面的设备发生block后,后面的设备即使有数据进来也要等待。为了解决这个问题,便有了非阻塞IO:如果设备1没有数据到来,read(设备1)也会立即返回,有数据就处理数据,没数据接着执行 read(设备2),有数据就处理数据,没有的话紧接着又去 read(设备1)……如此往复。这种解决方案叫Poll(轮询)
具体的实验代码和详细解释以及优化方案,可以看Allen大神的这篇博客。

4、fcntl()函数

函数原型

int fcntl(int fd, int cmd = F_GETFL); // 获取文件标志位
int fcntl(int fd, int cmd = F_SETFL, int arg); // 设置文件标志位

函数作用:设置文件标志位f_flag,它常用的值有:O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)、O_NONBLOCK(非阻塞)、O_APPEND(在尾端追加写)。。。。
参数解释:
fd–文件标志位
cmd–要进行的操作,F_GETFL读取文件标志位并返回;F_SETFL设置(修改)文件标志位。
arg–如果cmd=F_SETFL,则arg为新的f_flag的值。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

XiaoTong_zZZ

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值