我在我的程序中使用以下系统调用:
recvfrom
sendto
sendmsg
从上面提到的每个系统调用中,我检查它是否在没有任何中断的情况下完成,如果它被中断,我会重试。
前任:
recvagain:
len = recvfrom(fd, response, MSGSIZE, MSG_WAITALL, (struct sockaddr *)&from, &fromlen);
if (errno == EINTR) {
syslog(LOG_NOTICE, "recvfrom interrupted: %s", strerror(errno));
goto recvagain;
}
这里的问题是每次失败时我是否需要将 errno 值重置为 0。或者如果recvfrom() 成功,它是否将errno 重置为0?
recvfrom() 手册页说:
成功完成后,recvfrom() 以字节为单位返回消息的长度。如果没有消息可以接收并且对等方已经执行了有序关闭,recvfrom() 返回 0。否则该函数返回 -1 并设置 errno 以指示错误。
sendto 和 sendmsg 的情况相同。
我现在无法真正检查这一点,因为我无权访问服务器客户端设置。任何想法?
谢谢