accept()
내 서버 코드에서 수신 소켓에 대한 호출이 읽기 가능한 것으로 표시되었음에도 불구하고 가끔 차단되는 문제가 발생했습니다 . select()
내 이해는 이것이 자주 발생해서는 안 된다는 것입니다. 그러나 소켓이 "읽기 가능"할 때 데이터를 사용할 수 있다는 POSIX 표준 보증이 있는지 확실하지 않습니다. 현재 내 코드의 논리에 버그가 있는지 조사 중입니다. 하지만 이러한 유형의 문제에 대한 경험이 있고 이러한 문제가 발생하려면 어떤 유형의 상황이 발생해야 하는지 아는 사람이 있는지 궁금합니다. 감사해요.
답변1
이는 올바른 동작입니다. a 이후에 작업을 수행 하면 연결이 개시자에 의해 종료되었거나 다른 승인 프로세스에 의해 점유되었을 수 있으므로 accept()
연결이 여전히 승인 대기열에 있는지 여부를 확인할 수 없습니다 . select()
에서 man 2 accept
:
SIGIO
또는select(2)
, 를 전달하거나 가독성 이벤트를 반환한 후 호출 전에 비동기 네트워크 오류나 다른 스레드에 의해 연결이 삭제되었을 수 있으므로 연결이poll(2)
항상 대기하는 것은 아닙니다 . 이런 일이 발생하면 다음 연결이 도착할 때까지 기다리면서 호출이 차단됩니다. 차단되지 않도록 하려면 전달된 소켓에 플래그 세트 가 있어야 합니다 (참고자료 참조 ).epoll(7)
accept()
accept()
sockfd
O_NONBLOCK
socket(7)