select()는 FD를 읽을 수 있는 것으로 표시하지만 읽을 수 있는 데이터는 없습니다.

select()는 FD를 읽을 수 있는 것으로 표시하지만 읽을 수 있는 데이터는 없습니다.

accept()내 서버 코드에서 수신 소켓에 대한 호출이 읽기 가능한 것으로 표시되었음에도 불구하고 가끔 차단되는 문제가 발생했습니다 . select()내 이해는 이것이 자주 발생해서는 안 된다는 것입니다. 그러나 소켓이 "읽기 가능"할 때 데이터를 사용할 수 있다는 POSIX 표준 보증이 있는지 확실하지 않습니다. 현재 내 코드의 논리에 버그가 있는지 조사 중입니다. 하지만 이러한 유형의 문제에 대한 경험이 있고 이러한 문제가 발생하려면 어떤 유형의 상황이 발생해야 하는지 아는 사람이 있는지 궁금합니다. 감사해요.

답변1

이는 올바른 동작입니다. a 이후에 작업을 수행 하면 연결이 개시자에 의해 종료되었거나 다른 승인 프로세스에 의해 점유되었을 수 있으므로 accept()연결이 여전히 승인 대기열에 있는지 여부를 확인할 수 없습니다 . select()에서 man 2 accept:

SIGIO 또는 select(2), 를 전달하거나 가독성 이벤트를 반환한 후 호출 전에 비동기 네트워크 오류나 다른 스레드에 의해 연결이 삭제되었을 수 있으므로 연결이 poll(2)항상 대기하는 것은 아닙니다 . 이런 일이 발생하면 다음 연결이 도착할 때까지 기다리면서 호출이 차단됩니다. 차단되지 않도록 하려면 전달된 소켓에 플래그 세트 가 있어야 합니다 (참고자료 참조 ).epoll(7)accept()accept()sockfdO_NONBLOCKsocket(7)

관련 정보