前言:
此刻大家对“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 函数