내 프로그램에서 호출 나는 재 시도한다.시스템 호출의 반환 값과 errno를
예 : 여기
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;
}
문제는 내가 0에 실패 각각의 모든 시간의 errno 값을 다시 설정해야 할 것입니다. 또는 recvfrom()이 성공적이면 errno를 0으로 재설정합니까?
에 recvfrom() 매뉴얼 페이지는 말한다 :
성공적으로 완료되면,에 recvfrom()가 바이트 메시지의 길이를 반환합니다. 메시지를받을 수없고 수신자가 피어가 정상 종료를 수행 한 경우 recvfrom()은 0을 반환합니다. 그렇지 않으면이 함수는 -1을 반환하고 오류를 나타내는 errno를 설정합니다.
sendto 및 sendmsg와 동일한 경우.
서버 클라이언트 설정에 액세스 할 수 없으므로 지금은 이것을 확인할 수 없습니다. 아이디어가 있으십니까?
감사가 중단 (및 errno
EINTR
에 설정) 경우
'errno'를 지울 필요가 거의 없습니다; 나는 이것이 그 시대의 하나라고 생각하지 않는다. – nneonneo
'errno '를 지우는 남자의 이유는 이전에 관련이없는 시스템 콜에 의해 (이전에) 설정되었을 때를 커버하기위한 것입니다. –
일반적으로 신경 쓰지 않아야합니다. 내 답변에서 지적한 바와 같이 올바른 해결책은 'len'을 검사하여 오류가 실제로 발생했는지 확인하는 것입니다. – nneonneo