关注
`EAGAIN` 是 Unix 和类 Unix 操作系统中的一个错误码,代表 "Resource temporarily unavailable"(资源暂时不可用)。在涉及非阻塞操作的系统调用中,`EAGAIN` 通常被用来告诉你,操作在现在无法进行,但是在未来可能会成功。
当调用 `read()` 或 `send()` 或其他 I/O 函数时,在非阻塞模式下,可能会出现 `EAGAIN` 错误。
`read()` 时出现 `EAGAIN` 的原因:
当你在非阻塞的文件描述符上执行 `read()` 操作时,如果没有数据可供读取,而且调用该操作的进程不会被放入等待状态直到数据到达,这时操作系统会立即返回 `EAGAIN` 错误。这是告诉你,现在没有数据可读,但是你可以稍后重试。
例如,对一个非阻塞的 socket 或管道执行 `read()` 操作,如果接收缓冲区为空,那么 `read()` 调用将失败,并返回 `EAGAIN`。
`send()` 时出现 `EAGAIN` 的原因:
类似地,在非阻塞的 socket 上执行 `send()` 操作时,如果发送缓冲区已满,不能接受更多的数据,操作系统同样会返回 `EAGAIN` 错误。在这种情况下,可以等待一段时间直到缓冲区中的数据被对端读取出去一部分,释放出足够的空间后再次尝试发送。
处理 `EAGAIN` 错误的典型方法是使用 I/O 多路复用机制(如 select, poll, epoll 等)来监控文件描述符的状态,进而知道何时可以进行非阻塞读或写。在可读或可写时再次尝试对应的操作。如果你在应用程序中不希望处理 `EAGAIN` 错误,另一个解决方案是不使用非阻塞模式,或者对 `EAGAIN` 返回进行适当的重试逻辑处理。
查看原帖
点赞 评论
相关推荐
投递极智嘉 Geek+等公司6个岗位 >
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛客帮帮团来啦!有问必答 #
788960次浏览 12521人参与
# 机械制造薪资爆料 #
315612次浏览 3659人参与
# 晒一晒我的offer #
3429429次浏览 54897人参与
# 想实习转正,又想准备秋招,我该怎么办 #
114849次浏览 1289人参与
# 如果校招重来我最想改变的是 #
88538次浏览 1540人参与
# 海康威视求职进展汇总 #
98866次浏览 1190人参与
# 国企vs私企,你更想去? #
19481次浏览 198人参与
# 0offer是寒冬太冷还是我太菜 #
422846次浏览 4882人参与
# 通信硬件2024笔试面试经验 #
86647次浏览 942人参与
# 投了多少份简历才上岸 #
59561次浏览 968人参与
# 提前批过来人的忠告 #
21513次浏览 442人参与
# 荣耀求职进展汇总 #
68462次浏览 684人参与
# 投递实习岗位前的准备 #
622372次浏览 11087人参与
# 实习生如何通过转正 #
26594次浏览 355人参与
# 简历无回复,你会继续海投还是优化再投? #
22534次浏览 316人参与
# 你的工作大概什么时候入职? #
4618次浏览 55人参与
# 工作压力大怎么缓解 #
10657次浏览 151人参与
# 学历对求职的影响 #
139661次浏览 1595人参与
# 软件开发投递记录 #
476469次浏览 7219人参与
# 毕业租房也有小确幸 #
26863次浏览 1482人参与