Ram*_*Ram 3 c linux operating-system system-calls systems-programming
我在我的程序中使用以下系统调用:
recvfrom
sendto
sendmsg
Run Code Online (Sandbox Code Playgroud)
从上面提到的每个系统调用我检查它是否完成没有任何中断,如果它被中断,我重试.
例如:
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;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我需要在每次失败时将errno值重置为0.或者如果recvfrom()成功,它会将errno重置为0吗?
recvfrom()手册页说:
成功完成后,recvfrom()以字节为单位返回消息的长度.如果没有可接收的消息且对等体已执行有序关闭,则recvfrom()返回0.否则该函数返回-1并设置errno以指示错误.
与sendto和sendmsg相同的情况.
我现在无法真正检查这个,因为我无法访问服务器 - 客户端设置.任何的想法?
谢谢
recvfrom返回-1如果它被中断(并且设置errno到EINTR).因此,您应该检查len:
if(len == -1) {
if(errno == EINTR) {
syslog(LOG_NOTICE, "recvfrom interrupted");
goto recvagain;
} else {
/* some other error occurred... */
}
}
Run Code Online (Sandbox Code Playgroud)