通过read()读文件
一、在POSIX中的定义
#include <unistd.h> ssize_t read(int fd, void *buf, size_t len);
二、调用read()的可能结果
2.1 返回值为len;读取到的所有len个字节都被存储在buf中,结果和预期的一致;
2.2 返回值小于len大于0;读取到的字节被存储到buf中,原因:
(1)在读取过程中信号中断或在读取中出错;
(2)可读的数据大于0字节小于len字节在读取len字节之前到达EOF
2.3 返回0,表示EOF,没有更多的数据可读;
2.4 由于当前没有数据可用,调用阻塞;在非阻塞模式下,不会发生这种情况;
2.5 返回-1,并把errno置为EINTR,这表示在读取任何字节之前收到信号;调用可以重新执行;
2.6 返回-1,并把errno置为非EINTR或EAGAIN的一个值,这表示更严重的错误,重新执行读操作不会成功
三、读入所有字节
ssize_t ret;
while (len != && (ret = read(fd, buf, len)) != ) {
if (ret == -) {
if (errno == EINTR) {
continue;
}
perror("read");
break;
}
len -= ret;
buf += ret;
}
四、非阻塞读
文件描述符以非阻塞模式打开(即open调用中指定参数O_NONBLOCK),并且没有数据可读,read调用会返回-1,并设置
errno值为EAGAIN,而不是阻塞;当以非阻塞模式读文件时,必须检查EAGAIN,否则可能因为丢失数据导致严重错误
char buf[BUFSIZ];
ssize_t nr; start:
nr = read(fd, buf, BUFSIZ);
if (nr == -) {
if (errno == EINTR) {
goto start;
}
if (errno == EAGIN) {
// 稍后重新读取
} else {
// 发生错误
}
}
通过read()读文件的更多相关文章
- GoLang几种读文件方式的比较
GoLang提供了很多读文件的方式,一般来说常用的有三种.使用Read加上buffer,使用bufio库和ioutil 库. 那他们的效率如何呢?用一个简单的程序来评测一下: package main ...
- Python之路 day2 按行读文件
#1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: line = fil ...
- java的读文件操作
java读取文件内容,可以作如下理解: 首先获得一个文件句柄,File file = new File():file即为文件句柄.两人之间联通电话网络了,就可以开始打电话了. 通过这条线路读取甲方的信 ...
- PHP使用feof()函数读文件的方法
这篇文章主要介绍了PHP使用feof()函数读文件的方法,以实例形式对比了正确与错误的用法,阐明了feof()函数的使用技巧,需要的朋友可以参考下 本文实例讲述了PHP使用feof()函数读文件的方法 ...
- Java基础之读文件——使用输入流读取二进制文件(StreamInputFromFile)
控制台程序,读取Java基础之读文件部分(StreamOutputToFile)写入的50个fibonacci数字. import java.nio.file.*; import java.nio.* ...
- c++中ifstream读文件的问题(关于eof())
今天帮别人找BUG,是一段关于c++读写文件的问题,使用的是ifstream与outstream类,关于ofstream与ifstream的用法,此处不再獒述,见代码: #include<ios ...
- python (11)文件的读写 按行读文件
读文件: 读取文件 f = open('\info.txt') fil = f.read() f.close() 按行读文件: f = open("info.txt") while ...
- Python学习入门基础教程(learning Python)--5.2 Python读文件基础
上节简单的说明了一下Pyhon下的文件读写基本流程,从本节开始,我们做几个小例子来具体展示一下Python下的文件操作,本节主要是详细讲述Python的文件读操作. 下面举一个例子,例子的功能是读取当 ...
- Python按行读文件对比
1. 最基本的读文件方法: # File: readline-example-1.py file = open("sample.txt") while 1: lin ...
- java 读文件 解析
[Java]读取文件方法大全 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** ...
随机推荐
- 临时关闭Mysql ONLY_FULL_GROUP_BY
/** * @author lcc807@ikoo8.com * * 临时关闭Mysql ONLY_FULL_GROUP_BY */ function closeSqlFullMode(){ DB:: ...
- 基于C#.NET的高端智能化网络爬虫(二)(攻破携程网)
本篇故事的起因是携程旅游网的一位技术经理,豪言壮举的扬言要通过他的超高智商,完美碾压爬虫开发人员,作为一个业余的爬虫开发爱好者,这样的言论我当然不能置之不理.因此就诞生了以及这一篇高级爬虫的开发教程. ...
- 机器学习中的降维算法:ISOMAP & MDS
参见:https://blog.csdn.net/Dark_Scope/article/details/53229427
- Nginx PREACCESS阶段 如何限制每个客户端每秒处理请求数
L:56 limit_req_zone $binary_remote_addr zone=one:10m rate=2r/m;#以用户IP作为key 开辟共享内存10M 并且限制每分钟2个请求 rat ...
- mvc Filters 过滤器
项目需要控制controller和action的访问权限. 看了下资料,发觉还是很方便的. 首先在mvc项目下创建一个文件夹 Filters, 然后在Filters中创建一个类.代码如下 namesp ...
- Android 视频 教程 源码 电子书 网址
资源名称 资源地址 下载量 好评率8天快速掌握Android视频教程67集(附源码)http://down.51cto.com/zt/2197 32157Android开发入门之实战技巧和源码 htt ...
- poj2386(简单的dfs/bfs)
题目链接:http://poj.org/problem?id=2386 Description Due to recent rains, water has pooled in various pla ...
- centos6.5之Hadoop1.2.1完全分布式部署安装
0. 说明 系统中首先要安装好jdk环境. 已经配置ssh免密码登录. 设置好防火墙,或者关闭防火墙. 如果集群内机器的环境完全一样,可以在一台机器上配置好,然后把master配置好的软件即hadoo ...
- Ubuntu16.04中禁用UTC解决双系统时间问题
解决方法一 sudo hwclock -w --localtime 解决方法二 timedatectl set-local-rtc 1 解决方法三 修改/etc/adjtime文件中的UTC,为LOC ...
- ASP:当 request.cookies 发生 Microsoft VBScript 运行时错误 (0x800A000D) 类型不匹配: '[string:
昨天当一个客户告诉我,登录后看不到图片的时候,我还不相信,因为我的浏览器测试发现一切正常. 通过QQ远程协助后,我才发现服务器端真的报错: Microsoft VBScript 运行时错误 (0x80 ...