read的返回值结论(针对于普通文件描述符和管道或socket文件描述符情况划分)

关于read函数的返回值分析:

情况一:(读取普通文件而言)

01.阻塞情况

read函数从打开的设备或文件中读取数据。

read/write  (read和write函数会读取\n换行)

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

函数参数:

n  fd:文件描述符

n  buf:读上来的数据保存在缓冲区buf中

n  count:buf缓冲区存放的最大字节数

函数返回值:

n  >0:读取的字节数

n  =0:文件读取完毕 (对于文件而言,无论文件描述符是阻塞还是非阻塞,如果文件读取结束那么返回值都是零!)

n  -1: 出错,并设置errno

errno的错误代码

EINTR 此调用被信号所中断。

EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK == 非阻塞),若无数据可读取则返回此值。

EBADF 参数fd 非有效的文件描述词,或该文件已关闭。

情况二:(读pipe或者socket的缓冲区的数据,socket的缓冲区和pipe的缓冲区默认read都是阻塞的!!)

缓冲区的文件描述符是阻塞fd的情况:

n  >0:读取的字节数

n  =0:对端关闭,read读取的返回值是0,相当于读到文件结尾,(如果缓冲区没有被修改为非阻塞,那么缓冲区没有数据read函数会阻塞等待有数据再进行读取!)

n  -1: 出错,并设置errno(如果缓冲区的文件描述符被修改为非阻塞fd的时候,返回值如果是-1,同时 error是EAGAIN,表示缓冲区为空无数据可读取。)

时间: 2025-02-01 09:09:43

read的返回值结论(针对于普通文件描述符和管道或socket文件描述符情况划分)的相关文章

[转]用NPOI操作EXCEL--通过NPOI获得公式的返回值

本文转自:http://www.cnblogs.com/atao/archive/2009/10/12/1582085.html 前面我们学习了通过NPOI向Excel中设置公式,那么有些读者可能会问:“NPOI能不能获取公式的返回值呢?”,答案是可以! 一.获取模板文件中公式的返回值 如在D盘中有一个名为text.xls的Excel文件,其内容如下: 注意C1单元格中设置的是公式“$A1*$B1”,而不是值“12”.利用NPOI,只需要写简单的几句代码就可以取得此公式的返回值: HSSFWor

【OC学习-8】存取器方法?getter和setter?事实上就是赋值和返回值的两种函数

我们在声明类的时候,有实例变量+方法(函数),这些实例变量假设默认的话都是protected类型,一般无法直接訪问.更别提赋值和调用了,所以就产生了两种函数,getter函数就是可以返回实例变量的值,setter函数就是可以设置实例变量的值.(当然假设你把实例变量改成public的话可以直接调用,但不安全) 存取器方法(函数)就是:存--赋值setter函数.取--返回值getter函数. (1)先在类的.h文件中面声明这个函数(方法).一般都有默认的格式(例如以下):返回值函数的函数名字一般都

2.3.9 用NPOI操作EXCEL--通过NPOI获得公式的返回值

前面我们学习了通过NPOI向Excel中设置公式,那么有些读者可能会问:“NPOI能不能获取公式的返回值呢?”,答案是可以!一.获取模板文件中公式的返回值如在D盘中有一个名为text.xls的Excel文件,其内容如下: 注意C1单元格中设置的是公式“$A1*$B1”,而不是值“12”.利用NPOI,只需要写简单的几句代码就可以取得此公式的返回值: HSSFWorkbook wb = new HSSFWorkbook(new FileStream("d:/test.xls",FileM

【OC学习-8】存取器方法?getter和setter?其实就是赋值和返回值的两种函数

我们在声明类的时候,有实例变量+方法(函数),这些实例变量如果默认的话都是protected类型,一般无法直接访问,更别提赋值和调用了,所以就产生了两种函数,getter函数就是能够返回实例变量的值,setter函数就是能够设置实例变量的值.(当然如果你把实例变量改成public的话可以直接调用,但不安全) 存取器方法(函数)就是:存--赋值setter函数,取--返回值getter函数. (1)先在类的.h文件里面声明这个函数(方法),一般都有默认的格式(如下):返回值函数的函数名字一般都和变

Java连载27-有返回值的方法注意点

一.方法注意点 (1)方法的调用不一定再main方法中,可以在其他方法中进行调用,只要是程序执行到的位置,都可以去调用其他方法. (2)方法调用的时候,实参和形参要求个数对应相同,数据类型对应相同,方法不同的时候,要求能够进行相应的自动类型转换 (3)当方法的调用和方法在同一个类中的时候,“类名.”是可以省略不写的. (4)建议在一个java文件中只定义一个类为好,不要定义多个类,这里只是举例,不建议模仿 例子: public class d27_{ public static void mai

【Tips】Python 针对函数返回值实现列表推导

背景 设想这样一个场景,我们定义函数foo来生成一个大于0的随机code.但是函数执行可能会出现异常,对于异常情况我们指定函数返回-1. 在批量处理的情况下,我们想要得到所有成功执行的foo函数的返回值集合,而忽略返回-1的情况.基本的逻辑如下: result = [] for item in item_lst: code = foo(item) if code != -1: result.append(code) 使用列表推导的解决方案 如果想用列表推导的方式实现,有下面几种解决方案: Sol

模态窗口返回值兼容解决

1.打开弹出窗口时把 window 作为第二个参数传入. var result = window.showModalDialog(url, window, "dialogWidth=" + width + "px;dialogHeight=" + height + "px;resizable:yes;") if (typeof (result) == 'undefined') { result = window.ReturnValue; } re

C语言 realloc为什么要有返回值,realloc返回值详解/(解决任意长度字符串输入问题)。

在C语言操作中会用到大量的内存操作,其中很常用的一个是realloc(). 由字面意思可以知道,该函数的作用是用于重新分配内存. 使用方式如下: NewPtr=(数据类型*)realloc(OldPtr,MemSize) 其中OldPtr指向 待重新分配内存的指针. NewPtr指向 新分配空间的指针. MemSize为 分配后的空间大小. 该函数的使用涉及以下几个问题: 1.不同情况下的返回值 2.OldPtr指向的内存会不会自动释放 3.OldPtr和NewPtr分别是什么内容,他们有什么关

onInterceptTouchEvent与onTouchEvent默认返回值

其中Layout里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,Layout里的onTouch默认返回值是false, View里的onTouch默认返回值是true,当我们手指点击屏幕时候,先调用ACTION_DOWN事件,当onTouch里返回值是true的时候,onTouch回继续调用ACTION_UP事件,如果onTouch里返回值是false,那么onTouch只会调用ACTION_DOWN而不调用ACTION_UP. xm