非阻IO与EWOULDBLOCK EAGAIN

 默认 socket 是阻塞的,读写函数 read, readv,
recv, recvfrom, recvmsg 以及
write, writev,
send, sendto,
sendmsg 都有可能会阻塞。可以将 socket 描述字设为非阻塞,这样,当 socket 描述字未就绪时,调用以上读写函数将会返回 EWOULDBLOCK 或 EAGAIN 。

UNPv1 给出了一个 非阻塞socket + select 的例子。有人对此提出疑问:

假如fd1是一个阻塞socket,我将它加入select的readset中,然后用select去侦听fd1上是否有数据到来。我感觉这和非阻塞 socket的性质是一样的,因为它不会阻塞在fd1的recv 函数上,因为之前select已经判定到fd1可读,所以recv 就会返回不会阻塞。 那么为什么大家总要还要创建一个非阻塞的socket加入select中呢

有人给出的答案是:
select 只能说明 socket 可读或者可写,不能说明能读入或者能写出多少数据。比如,socket 的写缓冲区有 10 个字节的空闲空间,这时监视的 select 返回,然后在该 socket 上进行写操作。但是如果要写入 100 字节,如果 socket 没有设置非阻塞,调用 write 就会阻塞在那里。而更为要紧的是,在多个 socket 的情况下,读写一个socket 时阻塞,会影响到其他的 socket 。

出处:https://www.xuebuyuan.com/1995034.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值