龙空技术网

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

linux技术栈 1932

前言:

此刻大家对“linux 函数”大约比较注意,看官们都需要剖析一些“linux 函数”的相关文章。那么小编在网摘上收集了一些关于“linux 函数””的相关文章,希望各位老铁们能喜欢,大家快快来学习一下吧!

底层输入输出(Low-Level Input/Output)

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

1. 用于读取大块的二进制文件

2. 在解析之前将整个文件读入内核

3. 执行数据传输以外的操作

4. 将描述符传递给子进程

你需要知道这 4 个使用底层 IO 的原因,在以后遇到实际的情况时能够想到利用底层 IO 来解决。因为底层输入输出的函数也有很多,这篇博客主要介绍 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

打开文件也可以用 create,不过这个函数已经弃用了!

close

再来看看 close,关闭文件会有如下结果:

1. 文件描述符被取消分配

2. 文件上进程所拥有的任何记录锁都将被解锁

3. 当与管道或 FIFO 相关联的所有文件描述符都已关闭时,任何未读数据被丢弃

实例 1: open_close.c

我们来看一个简单的例子:

编译: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 中。

write

write 函数从 buffer 中取出 size 个字节的数据,写到 filedes 描述符表示的文件中。

实例 2: read_write.c

来看一个简单的读写文件的例子:读取 file1 的内容,写到 file2 中,相当于文件拷贝

编译:

gcc read_write.c -o read_write

运行,1.txt 的内容是 hello world:

写入成功,查看下 2.txt 的内容:

cat 2.txt

hello world

发现成功写入 hello world 到 2.txt 文件了,并且注意到 fd1 = 3, fd2 = 4,这也说明前面的 3 个文件描述符被系统使用了。

lseek

lseek 用来移动文件指针,什么是文件指针呢?你可以理解为当前读取或者写入的位置,我们移动这个指针可以控制读取或者写入数据的位置,声明如下:

其中 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) 来求文件的长度,这个操作经常被使用。

编译: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 个例子搞清楚,基本的用法也就掌握的差不多了

注:需要C/C++ Linux服务器开发学习资料私信“资料”(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等),免费分享

标签: #linux 函数