gpt4 book ai didi

sockets - 'EAGAIN' 或 'EWOULDBLOCK' 之间的区别

转载 作者:可可西里 更新时间:2023-11-01 02:33:54 24 4
gpt4 key购买 nike

我需要了解 EAGAIN 和 EWOULDBLOCK 之间的区别,因为我看到许多源代码仅针对 EAGAIN 检查(可能两个代码代表相同的数字,请在此处纠正我。)

我的部分知识:对于阻塞套接字,如果发送方缓冲区已满且接收方未接收到任何数据,则如果调用 send(),发送方将被挂起。这是因为一旦数据被接收器读取,它在缓冲区中使用的空间就可以用于新数据。如果您的套接字处于“非阻塞”模式,则“send()”将失败并返回“EAGAIN”或“EWOULDBLOCK”。

它们总是相同的数字还是在任何情况下都需要区别对待。 ?

最佳答案

简而言之:它们几乎总是相同的值,但为了可移植性,建议检查这两个值(并以相同的方式处理这两个值)。

对于大多数系统,EAGAINEWOULDBLOCK 是相同的。它们只有几个系统不同,您可以查看这些系统的列表in this answer .

即使是 errno manpage提到它们“可能是相同的[值]”。

然而,从历史上看,EWOULDBLOCK 被定义为“操作会阻塞”——也就是说,操作 已经阻塞,但是描述符被置于非阻塞模式. EAGAIN 最初表示“暂时的资源短缺使操作无法进行”。 gnu documentation 使用的示例是当没有足够的资源来fork() 时。由于预计资源短缺是暂时的,因此后续尝试执行该操作可能会成功(因此得名“再次”)。

实际上,这些类型的临时资源短缺并不常见(但一旦发生则相当严重)。

大多数系统都将这些值定义为相同的,并且将来不这样做的系统会越来越少见。然而,出于可移植性的原因,您应该检查这两个值,但您也应该以相同的方式处理这两个错误。作为GNU documentation状态:

Portability Note: In many older Unix systems ... [EWOULDBLOCK was] a distinct error code different from EAGAIN. To make your program portable, you should check for both codes and treat them the same.

关于sockets - 'EAGAIN' 或 'EWOULDBLOCK' 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49049430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com