libev를 사용하여 tcp 서버를 작성하고 있습니다. listen()을 수행 한 다음 socket 및 forking을 작성한 다음 수신 소켓에서 libev 읽기 감시자를 시작하고 watcher 콜백에서 클라이언트 연결을 수신합니다. 자식과 부모 (또는 두 개 이상의 자식이있는 경우 두 자식)가 청취 소켓을 읽을 수있게 된 이벤트를 수신하고 둘 다 클라이언트 연결을 accept()하려고하면 상황이 발생할 수 있습니다.이 경우 프로세스 중 하나가 차단됩니까? 필자는 테스트 프로그램을 작성했으며 단 하나의 프로세스가 읽기 준비 이벤트를 수신하는 것으로 보이지만 어쩌면 내가 잘못 생각한 것일까 요? 이 경우 시스템 동작에 대해 어디에서 읽을 수 있습니까? 커널이 프로세스간에로드 밸런싱을 수행하고 이벤트를 수신 할 사람을 결정하는 방법은 무엇입니까? 백엔드 (select, epoll etc ...) 및/또는 OS 고유입니까?자식 이벤트 수신
3
A
답변
1
두 프로세스 모두 소켓에서 준비 상태 표시를 수신하고 두 결과 모두 accept()
을 호출 할 가능성이 매우 높습니다. 이는 항상 socket()
, poll()
, epoll()
또는 kqueue()
(또는 이들 중 하나 이상에 대한 추상화를 제공하는 libev)과 같은 이벤트 기반 API에서 비 차단 파일 디스크립터를 사용해야하는 이유 중 하나입니다. 비 차단 소켓을 사용하는 경우 한 어린이는 accept()
에서 성공적인 결과를 얻고 다른 모든 어린이는 EAGAIN
을 얻고이를 무시하고 아무런 해를 끼치 지 않고 다시 잠자기 모드로 돌아갑니다.
비 블로킹 소켓을 사용하는 것이 좋습니다. 감사합니다. 감사합니다. – user1940679