첫 번째와 formost에서 'pselect'에 대한 질문으로 태그를 붙일 수있는 평판이 없었기 때문에 '선택'을 사용했습니다.pselect가 가끔씩 중단됩니다.
UDP 소켓에서 시간 초과를 처리하기 위해 pselect를 사용합니다. 코드는 다음과 같습니다
UDP_STATUS udp_socket_recv(udp_socket_t* p_sock, int* p_bytes_rcvd)
{
int res = 0;
fd_set fds;
struct timespec timeout;
FD_ZERO(&fds);
FD_SET(p_sock->m_socket, &fds);
if (p_sock->m_timeout == NULL) {
res = pselect(p_sock->m_socket + 1, &fds, NULL, NULL, NULL, NULL);
} else {
timeout.tv_sec = p_sock->m_timeout->tv_sec;
timeout.tv_msec = p_sock->m_timeout->tv_usec * 1000;
res = pselect(p_sock->m_socket + 1, &fds, NULL, NULL, &timeout, NULL);
}
if (res == 0)
return UDP_TIMEOUT;
else if (res == -1) {
printf("pselect error: %s\n", strerror(errno)); /* Sometimes we end up here */
return UDP_FAILURE;
}
res = recvfrom(p_sock->m_socket, ..); /* etc etc */
}
이제, 케이스의 대부분에서 잘 위의 작품 (I 복사/붙여 넣기 할 수있는 권한이 없기 때문에 내가 뭔가를 잘못 입력했을 수도 있지만). 그러나 pselect는 때때로 strerror (errno) 호출로 "Interrupted system call"을 호출하여 -1을 반환합니다. 나는 이것이 내가 심지어 내가이 솔루션을 함께했다 방법을 기억할 수없는, 당신은 소켓 타임 아웃을하는 방법입니다 모르겠어요
...
어떤 도움이 많이 감사합니다.
글쎄, 이것은 중단 된 시스템 호출 일뿐입니다. pselect()를 다시 호출하면 mybe가 이번에 성공할 것이다. BTW'if (p_sock-> m_timeout == NULL) {'timeout이 NULL이면 pselect 만 호출합니다. 당신은 아마도'else {...}'의 경우 pselect()를 호출하기를 원할 것입니다. – wildplasser
예, 죄송합니다. else 절의 pselect를 잊어 버렸습니다. pselect에 대한 호출을 다시 수행하면 다시 실패하면 어떻게됩니까? – user1986698