关于read函数的一些分析

在文件描述符为非阻塞模式、epoll为ET触发方式的前提下,调用read后根据返回值有不同处理。nread<0返回EINTR时按需重启服务;nread<0返回EAGAIN,在ET触发下表示读到末尾;nread=0时若客户端关闭连接,应修改http为正在断开状态。
 1 ssize_t readn(int fd, std::string &inBuffer, bool &zero)
 2 {
 3     ssize_t nread = 0;
 4     ssize_t readSum = 0;
 5     while (true)
 6     {
 7         char buff[MAX_BUFF];
 8         if ((nread = read(fd, buff, MAX_BUFF)) < 0)
 9         {
10             if (errno == EINTR)//慢调用被系统中断时返回的错误,需要冲洗read,所以用continue
11                 continue;
12             else if (errno == EAGAIN)//表示没有数据可读,在ET边缘触发方式下,要求我们做到读无可读
13             {
14                 return readSum;
15             }  
16             else
17             {
18                 perror("read error");
19                 return -1;
20             }
21         }
22         else if (nread == 0)
23         {
24             //printf("redsum = %d\n", readSum);
25             zero = true;
26             break;
27         }
28         readSum += nread;
29         inBuffer += std::string(buff, buff + nread);
30     }
31     return readSum;
32 }

前提:文件描述符为非阻塞模式,epoll为ET触发方式

调用read之后,根据返回值可分为不同情况:

①nread<0 返回EINTR:该错误为慢系统调用期间进程捕捉到信号使得该系统调用被中断返回时造成的识别码,此时根据需要来重启服务

②nread<0 返回EAGAIN:如果之前已经将读缓冲区中的内容读完,此时该描述符已经变成了不可读状态,由于fd是非阻塞模式,再read就会返回EAGAIN,在ET触发方式下,可表示已经读到了末尾返回readsum

③nread=0 如果客户端关闭连接,那么收到客户的FIN将导致read函数返回0,此时应该修改http为正在断开状态

转载于:https://www.cnblogs.com/AKUN-FYK/p/10935479.html

<think>嗯,用户想了解read函数的参数用法和含义,特别是参数详解和使用说明。首先,我需要确定用户指的是哪个read函数,因为在不同的编程语言和上下文中,read函数可能有不同的实现。根据用户提供的引用,提到了Python的pandas库中的read_excel函数,还有Linux系统下的read函数。所以可能用户对这两个方面都感兴趣,或者混淆了它们。需要进一步分析。 先看用户提供的引用,引用[2]、[4]是关于pandas的read_excel函数的,而引用[3]是关于Linux系统的read函数的。用户的问题可能同时涉及这两个方面,但需要明确区分。用户的问题描述中提到“read函数 参数详解 使用说明”,可能用户不清楚两者之间的区别,或者想同时了解两者的参数。因此,我应该在回答中分别说明这两个不同的read函数,避免混淆。 接下来,我需要整理这两个函数的参数。首先是Linux系统调用中的read函数,参数包括文件描述符fd、缓冲区指针buf、以及要读取的字节数count。这部分需要解释每个参数的作用,以及返回值的情况。引用[3]已经提到这些,可以引用作为说明。 然后是pandas的read_excel函数,用户可能更关注这个,因为引用中有详细的参数列表。如converters、dtype、sheet_name、header等。需要将这些参数分类,解释常用参数和高级参数,并给出示例,比如如何使用converters转换列的数据类型,或者如何指定工作表名称。 用户的问题可能需要同时覆盖这两个方面,因此需要分两个部分来回答,每个部分详细说明参数,并给出使用示例。同时,用户可能希望了解如何在实际应用中使用这些参数,所以示例代码会很有帮助。例如,在pandas中如何读取Excel文件并转换列类型,或者在Linux系统编程中如何正确使用read函数读取文件内容。 另外,需要确保回答的结构清晰,分点说明,让用户容易理解。同时,生成的相关问题要针对这两个不同的read函数,可能包括性能优化、错误处理、实际应用场景等。 最后,需要检查是否引用了正确的引用来源,比如引用[3]对应Linux的read函数,引用[2][4]对应pandas的read_excel函数。确保引用的内容准确,并且在回答末尾正确标注引用标识。</think># read函数参数详解及使用说明 ## 一、Linux系统级read函数 Linux系统调用`read()`用于从文件描述符读取数据,原型为: ```c ssize_t read(int fd, void *buf, size_t count); ``` ### 核心参数解析 1. **fd**(文件描述符) - 通过`open()`函数获取的整数标识 - 示例:`open("/path/file", O_RDONLY)` - 特殊值:`0`表示标准输入,`1`表示标准输出,`2`表示标准错误[^3] 2. **buf**(缓冲区指针) - 用户预先分配的内存空间 - 大小应至少容纳`count`字节 - 示例:`char buffer[1024];` 3. **count**(读取字节数) - 单次读取的最大字节数 - 实际读取量可能小于该值(如到达文件末尾) - 示例:`read(fd, buf, 512)`[^3] ### 返回值说明 ```c if(ret > 0) // 成功读取的字节数 if(ret == 0) // 到达文件末尾(EOF) if(ret == -1)// 读取错误(需检查errno) ``` ## 二、Pandas库read_excel函数 `pd.read_excel()`用于读取Excel文件,参数结构: ```python pd.read_excel(io, sheet_name=0, header=0, converters=None, ...) ``` ### 关键参数解析 | 参数 | 类型 | 说明 | 示例 | |------|------|------|------| | **io** | str/bytes | 文件路径或对象 | `r"data.xlsx"` | | **sheet_name** | int/str/list | 工作表选择 | `0`(默认), `"Sheet1"` | | **header** | int/list | 列标题行位置 | `0`(默认), `[0,1]` | | **converters** | dict | 列转换函数 | `{"ID": str}`[^2] | | **dtype** | dict | 列数据类型 | `{"Price": float}` | | **usecols** | int/str/list | 指定读取列 | `"A:C"`, `[0,2]` | ### 高级应用示例 ```python # 转换ID列为字符串,跳过前两行 data = pd.read_excel("data.xlsx", converters={"ID": lambda x: f"ID-{x}"}, skiprows=2, usecols="A:D") ``` ## 三、使用场景对比 1. **系统级read**:适合底层文件操作、设备驱动开发 2. **Pandas read_excel**:适合数据分析场景,支持: - 自动类型推断 - 日期解析 - 缺失值处理 - 多工作表读取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值