加入收藏 | 设为首页 | 会员中心 | 我要投稿 海洋资讯信息网_我爱站长网 (https://www.haijunwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux 应用开发 - 必须掌握的 5 个底层 IO 函数

发布时间:2022-10-05 16:40:27 所属栏目:Linux 来源:
导读:  底层输入输出(Low-Level Input/Output)

  这篇文章主要介绍 Linux 原生的 IO 操作(Low IO),你可能会想不是有跨平台的 ANSI C 可以使用么,为啥还要学习底层 IO ? 有以下 4 个原因:

  1. 用于读
  底层输入输出(Low-Level Input/Output)
 
  这篇文章主要介绍 Linux 原生的 IO 操作(Low IO),你可能会想不是有跨平台的 ANSI C 可以使用么,为啥还要学习底层 IO ? 有以下 4 个原因:
 
  1. 用于读取大块的二进制文件
 
  2. 在解析之前将整个文件读入内核
 
  3. 执行数据传输以外的操作
 
  4. 将描述符传递给子进程
 
  你需要知道这 4 个使用底层 IO 的原因,在以后遇到实际的情况时能够想到利用底层 IO 来解决。因为底层输入输出的函数也有很多linux feof函数,这篇博客主要介绍 5 个最常用,最基本的底层 IO 函数:
 
  1. 打开文件:open
 
  2. 关闭文件:close
 
  3. 读取文件:read
 
  4. 写入文件:write
 
  5. 操作文件指针:lseek
 
  如果你还有兴趣学习其他的底层 IO 函数,建议你查看 glibc 的官方底层 IO 的学习资料,那是最好,最权威的资料,下面就一起来看看这 5 个函数的用法。
 
  open & close
 
  我们操作 IO 首先要学会的就是打开和关闭文件,我们使用 open 和 close 这两个函数,他们的声明如下(man 2 open):
 
  open
 
  linux feof函数_linux feof函数_feof函数介绍
 
  打开文件也可以用 create,不过这个函数已经弃用了!
 
  close
 
  再来看看 close,关闭文件会有如下结果:
 
  1. 文件描述符被取消分配
 
  2. 文件上进程所拥有的任何记录锁都将被解锁
 
  3. 当与管道或 FIFO 相关联的所有文件描述符都已关闭时,任何未读数据被丢弃
 
  linux feof函数_linux feof函数_feof函数介绍
 
  实例 1: open_close.c
 
  我们来看一个简单的例子:
 
  linux feof函数_feof函数介绍_linux feof函数
 
  编译:gcc open_close.c -o open_close
 
  运行,我们没有新建 1.txt 文件:
 
  ./open_close 1.txt
 
  file open success.
 
  file close success.
 
  文件打开成功,并且当前目录下也有了一个 1.txt 文件了,说明我们指定的 O_CREAT 标记使得程序建立了这个文件。这两个函数基本用法就是这样,更多更详细的用法还需要你自己到 glibc 官网或者 man 2 open 去找。
 
  read & write
 
  我们在打开文件后肯定会做的就是读写文件了,不然你打开文件干嘛,我们来看看读文件的 API:
 
  read
 
  read 函数从文件描述符 filedes 指定的文件中读取 size 个字节,存储到 buffer 中。
 
  linux feof函数_feof函数介绍_linux feof函数
 
  write
 
  write 函数从 buffer 中取出 size 个字节的数据,写到 filedes 描述符表示的文件中。
 
  feof函数介绍_linux feof函数_linux feof函数
 
  实例 2: read_write.c
 
  来看一个简单的读写文件的例子:读取 file1 的内容,写到 file2 中,相当于文件拷贝
 
  linux feof函数_linux feof函数_feof函数介绍
 
  编译:
 
  gcc read_write.c -o read_write
 
  运行,1.txt 的内容是 hello world:
 
  feof函数介绍_linux feof函数_linux feof函数
 
  写入成功,查看下 2.txt 的内容:
 
  cat 2.txt
 
  hello world
 
  发现成功写入 hello world 到 2.txt 文件了,并且注意到 fd1 = 3, fd2 = 4,这也说明前面的 3 个文件描述符被系统使用了。
 
  lseek
 
  lseek 用来移动文件指针,什么是文件指针呢?你可以理解为当前读取或者写入的位置,我们移动这个指针可以控制读取或者写入数据的位置,声明如下:
 
  linux feof函数_linux feof函数_feof函数介绍
 
  其中 whence 参数需要特别注意,它有 3 种情况:
 
  1. SEEK_SET:设置文件指针指向文件开始并偏移 offset 字节处
 
  2. SEEK_CUR:设置文件指针只想当前位置偏移 offset 字节处
 
  3. SEEK_END:设置文件指针指向文件末尾偏移 offset 字节处
 
  实例 3:file_length.c
 
  我们可以使用 int file_length = lseek(fd, 0, SEEK_END) 来求文件的长度,这个操作经常被使用。
 
  linux feof函数_feof函数介绍_linux feof函数
 
  编译:gcc file_length.c -o file_length
 
  运行,注意到 1.txt 中的 hello world 加上 ‘\0’ 一共 12 个字符:
 
  ./file_length 1.txt
 
  file1 open success: fd = 3
 
  file_length = 12
 
  file1 close success.
 
  打印出 12,计算正确啦。
 
  结语
 
  到此,我们就学习了 5 个底层的 IO 函数,并实际练习了 3 个例子,把这 3 个例子搞清楚,基本的用法也就掌握的差不多了
 

(编辑:海洋资讯信息网_我爱站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!