linux的文件IO操作---read函数如何退出

关于 read 函数和 EOF(End Of File)的概念。
1. EOF 的定义:

EOF 是一个信号,表示文件的末尾已经被到达,没有更多的数据可以读取。在 Unix 和 Linux 系统中,EOF 通常与文件的结束关联,但也可以与管道或网络连接的关闭关联。
2. read 函数的行为:

当 read 函数被调用,并且文件描述符指向的文件还有数据可读时, read 会读取数据并返回实际读取的字节数。

如果文件描述符指向的文件没有数据可读,且文件描述符设置为阻塞模式, read 函数会阻塞调用进程,直到有数据可读或者文件被关闭。

当文件被关闭或者到达文件末尾时, read 函数会返回0,这表示 EOF。这意味着没有更多的数据可以读取。
3. EOF 的触发条件:

文件末尾:对于普通文件,当 read 到达文件的末尾时,会返回0,表示 EOF。

文件关闭:对于管道或套接字,当对方关闭连接时, read 也会返回0,表示 EOF。

特殊文件:对于特殊文件(如终端),EOF 可能由用户输入特定的字符组合(如 Ctrl+D)来触发。

  1. 阻塞与非阻塞:

阻塞模式:在阻塞模式下,如果 read 没有数据可读,它会等待直到有数据可读或者 EOF 条件满足。

非阻塞模式:在非阻塞模式下,如果 read 没有数据可读,它会立即返回 -1 ,并设置 errno 为 EAGAIN 或 EWOULDBLOCK 。

"没有数据就会发送EOF",这并不完全准确。EOF 是在文件末尾或者文件被关闭时发送的,而不是仅仅因为没有数据可读。在阻塞模式下, read 会等待直到有数据可读 或者EOF 条件满足 ,而不是仅仅因为没有数据就返回 EOF

read 函数触发 EOF 的情况可以总结如下:
1. 普通文件:

当 read 函数从普通文件中读取数据,到达文件末尾时,没有更多的数据可以读取, read 函数会返回0,表示 EOF。
2. 管道和套接字:

对于管道(pipe)和套接字(socket), read 函数的行为与普通文件有所不同。在这些情况下, read 函数的 EOF 信号通常与对方关闭写端(write end)相关联。
当管道的写端被关闭,且写端没有更多的数据可供读取时,读端(read end)的 read 函数会返回0,表示 EOF。
对于套接字,当对方关闭连接或者连接被远程主机正常关闭时, read 函数也会返回0,表示 EOF。

这两种情况都会导致 read 函数返回0,但原因不同:

对于普通文件,返回0是因为到达了文件的物理末尾

对于管道和套接字,返回0是因为通信的另一端已经关闭,没有更多的数据可以读取。

这种设计允许程序通过检查 read 函数的返回值来判断是否已经到达数据流的末尾,无论是因为文件结束还是因为通信的另一端关闭。

相关推荐
weixin_448119945 分钟前
Datawhale 用Markdown语法轻松开发AI应用202512 第1次作业
运维·服务器
知识分享小能手8 分钟前
CentOS Stream 9入门学习教程,从入门到精通,Linux日志分析工具及应用 —语法详解与实战案例(17)
linux·学习·centos
ZXF_H21 分钟前
Linux tcpdump抓包实践(以http为例)
linux·http·wireshark·tcpdump
悄悄敲敲敲23 分钟前
Linux:信号(二)
linux·操作系统·信号
Felven39 分钟前
飞腾D2000 GPIO中断调试
linux·gpio·中断·d2000
西格电力科技1 小时前
面向工业用户的绿电直连架构适配技术:高可靠与高弹性的双重设计
大数据·服务器·人工智能·架构·能源
CodeCraft Studio1 小时前
用“录制宏”轻松实现文档自动化:ONLYOFFICE 宏功能实践解析
运维·自动化·onlyoffice·录制宏·创建宏·文档自动化·文档协同
喵了meme1 小时前
Linux学习日记21:读写锁
linux·c语言·学习
广东大榕树信息科技有限公司2 小时前
当运维管理面临挑战时,如何借助动环监控系统提升响应能力?
运维·网络·物联网·国产动环监控系统·动环监控系统
The star"'2 小时前
02-Ansible 基本使用
运维·云计算·ansible