read - 在文件描述符上执行读操作
概述
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
描述
read() 从文件描述符 fd 中读取 count 字节的数据并放入从 buf 开始的缓冲区中.
如果 count 为零,read()返回0,不执行其他任何操作. 如果 count 大于SSIZE_MAX,那么结果将不可预料.
返回值
成功时返回读取到的字节数(为零表示读到文件描述符), 此返回值受文件剩余字节数限制.当返回值小于指定的字节数时并不意味着错误;这可能是因为当前可读取的字节数小于指定的字节数(比如已经接近文件结尾,或者正在从管道或者终端读取数据,或者 read()被信号中断). 发生错误时返回-1,并置 errno 为相应值.在这种情况下无法得知文件偏移位置是否有变化.
错误代码
EINTR
在读取到数据以前调用被信号所中断.
EAGAIN
使用 O_NONBLOCK 标志指定了非阻塞式输入输出,但当前没有数据可读.
EIO
输入输出错误.可能是正处于后台进程组进程试图读取其控制终端,但读操作无效,或者被信号SIGTTIN所阻塞, 或者其进程组是孤儿进程组.也可能执行的是读磁盘或者磁带机这样的底层输入输出错误.
EISDIR
fd 指向一个目录.
EBADF
fd 不是一个合法的文件描述符,或者不是为读操作而打开.
EINVAL
fd 所连接的对象不可读.
EFAULT
buf 超出用户可访问的地址空间.
也可能发生其他错误,具体情况和 fd 所连接的对象有关. POSIX 允许 read 在读取了一定量的数据后被信号所中断,并返回 -1(且 errno 被设置为EINTR),或者返回已读取的数据量.
兼容于
SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3
限制
在NFS文件系统中,读取小块数据仅更新时间标记,之后的调用不再读取服务器端的数据.这是因为客户端把数据放在缓存里. 由于大多数情况下不存在NFS服务器向客户端的读操作, 所以NFS客户必须将更新时间标记的操作放在服务器端,而数据可以放在客户端的缓存里留待以后更新.UNIX也可以禁用客户端的缓存,但那样的话大多数情况下会导致服务器性能下降.
相关文章
- C# 执行bat批处理文件
- SQL Server执行大文件SQL脚本
- bat批处理文件按顺序执行exe
- win10系统找不到指定文件怎么办?10种解决方法帮你解决
- Linux下执行.sh文件
- 隐藏执行批处理bat文件
- SwiftUI 读取CSV文件并显示支持不同文件载入(经典例子教程含源码)
- ubuntu为文件添加可执行权限
- Eclipse导出可执行Java工程/可执行Jar文件(包含第三方Jar包)
- SQLite的原子提交--单文件场景
- 一个编译可执行jar包 jar包中不包含resources下config.properties且可以读到config.properties文件且classpath中有当前路径的pom
- mybatis_mybatis写mapper文件注意事项
- Linux命令:Linux创建文件4种方式、ps命令显示进程状态、let命令执行一个或多个表达式
- selenium之批量执行测试用例生成HTML结果文件
- [Oracle运维工程师手记] 如何从trace 文件,判断是否执行了并行
- Linux基础第四课——文件操作
- WSL无法删除文件,文件权限问题
- Python打开和关闭文件
- 【项目实战】——Python打包正装换底色代码为exe文件(可在其他无Python环境下运行)
- C# 读取Json文件
- 使用mysqlbinlog从二进制日志文件中查询mysql执行过的sql语句 (原)
- 如何 Windows Server 2008 R2通过计划任务定时执行bat文件,定时备份数据库数据
- linux编写脚本执行.py文件
- 将可执行的jar打包成exe文件