信号中断数据报套接字sendto/recvfrom调用的行为咨询
信号中断数据报套接字sendto/recvfrom的行为
sendto 调用的表现
- UDP是面向消息的协议,
sendto对数据报套接字的操作具有原子性:要么完整发送整个数据报(返回数据报的字节数),要么完全未发送。 - 若信号在
sendto未开始写入网络缓冲区前触发,调用会返回-1,同时errno被设为EINTR。 - 一旦内核已将数据报成功写入网络缓冲区,哪怕后续触发信号,
sendto仍会返回成功的字节数,不会被中断返回错误。
recvfrom 调用的表现
- 同理,
recvfrom对数据报套接字的读取也是原子性的:要么完整接收一个数据报(返回数据报长度),要么未接收到任何有效数据。 - 若信号在
recvfrom未接收到完整数据报时触发,调用返回-1,errno设为EINTR。 - 只要内核已接收到完整数据报并准备好拷贝到用户缓冲区,即便此时收到信号,
recvfrom也会返回数据报的字节数,不会因信号中断返回错误。
结论
- 数据报套接字的
sendto和recvfrom不会出现返回部分字节数的情况:要么返回完整的消息长度(操作成功),要么返回-1且errno=EINTR(被信号中断且未完成任何操作)。 - 你无需处理“部分发送/接收后重复调用”的场景,只需根据返回值判断:若为
-1且errno=EINTR,可选择重新发起调用;否则按成功或其他错误逻辑处理。
内容的提问来源于stack exchange,提问作者Michal Butterweck
相关产品推荐
相关产品推荐

