리눅스 epoll 예제

기본적으로 epoll은 레벨 트리거 알림을 제공합니다. epoll_wait에 대한 모든 호출은 준비된 관심 목록에 속한 파일 설명자의 하위 집합만 반환합니다. 이벤트 — 우리가 실제로 fd를 모니터링하려는 이벤트를 저장하는 epoll_event라는 구조에 대한 포인터입니다. 하지만 오늘 우리는 이 책에서 배운 것에 대해 이야기할 것입니다: 선택, 여론 조사 및 대poll 시스템 호출. epoll을 사용하면 epoll_ctl 호출을 사용하여 epoll 인스턴스의 관심 목록에 파일 설명기를 추가한 다음 epoll_waitin을 미래에 호출할 때 이후에 준비 정보를 찾으려는 파일 설명기를 전달할 필요가 없습니다. 커널은 다시 I/O에 사용할 수 있는 설명자에 대한 정보만 반환하며, 커널이 전달된 모든 설명자에 대한 정보를 반환하는 선택/폴링 모델과는 대조적입니다. 레벨 트리거 된 인터페이스와 같은 사용 하는 경우 대 poll의 사용 poll (2)의 동일한 의미 체계를 가지고 있지만, 가장자리 트리거된 사용 응용 프로그램 이벤트 루프에서 실속을 피하기 위해 더 많은 clarifiction 필요 합니다. 이 예제에서 수신기는 listen(2)이 호출된 비차단 소켓입니다. do_use_fd(함수)는 읽기(2) 또는 쓰기(2)에서 EAGAIN이 반환될 때까지 새 준비된 파일 설명자(2)를 사용합니다.

이벤트 기반 상태 머신 응용 프로그램은 EAGAIN을 받은 후 다음 호출에서 do_use_fd() 이후 중지된 위치에서 계속 읽기(2) 또는 write(2)되도록 현재 상태를 기록해야 합니다. 따라서 4개의 파일 설명자(fd1, fd2, fd3 및 fd4)가 등록되어 있고 epoll_wait를 호출할 때 두 개의 파일(fd2 및 fd3)만 준비된 경우 이 두 설명자에 대한 정보만 반환됩니다. epoll_ctl을 사용하여 epoll 인스턴스의 관심 목록에 파일 설명자(예: fd0)를 추가하는 경우 실제로 epoll 인스턴스의 관심 목록에 fd0의 기본 파일 설명이 표시됩니다. 특히 이러한 이야기는 어떻게 epoll의 멀티 스레드 프로그램에 대 한 지원 역사적으로 좋은 되지 않았습니다., 비록 리눅스에서 몇 가지 개선 했다 4.5. 나는 설문 조사의 정의를보고 이것을 확인하기 위해 리눅스 커널 소스에서 선택하고 사실입니다! epoll 인스턴스는 epoll_create 시스템 호출을 통해 만들어지며, 이 호출은 epoll 인스턴스에 파일 설명기를 반환합니다. epoll_create의 서명은 다음과 같습니다: 레벨 트리거된 경우 epoll_wait에 대한 호출은 fd1이 준비된 유일한 설명자이므로 프로세스에 fd1을 반환합니다. 그러나 에지 트리거된 경우 t4와 t6 사이의 fd3에서 참조하는 소켓에 새 데이터가 도착하지 않았기 때문에 이 호출이 차단됩니다. 여기서 EPOLL_QUEUE_LEN은 한 번에 관리할 것으로 예상되는 최대 연결 설명자 수입니다. 반환 값은 나중에 epoll 호출에 사용되는 파일 설명자입니다. 이 설명자는 더 이상 필요하지 않을 때 close()로 닫을 수 있습니다. 결과적으로, epoll의 비용은 O(발생한 이벤트 수)이며 선택/폴링의 경우와 마찬가지로 O(모니터링중인 설명자 수)가 아닙니다.

이 게시물은 “방법”부분을 캡처하는 것을 목표로했다. 이러한 대란성 에 대한 의미론에 의해 난파 된 “광기”를 이해하기 위해, 좋은 참조는 다음과 같은 두 개의 블로그 게시물이 될 것입니다 : 당신이 당신의 응용 프로그램에서 다음 단계를 수행해야 하는 설문 조사 방법을 사용하려면 : fd – 우리가 epoll 목록 / 관심에 추가 할 파일 설명자입니다 목록. — 프로세스 A가 자식 프로세스 B를 포크하는 경우 B는 epoll 설명자인 fd9를 포함한 A의 모든 설명자들을 상속합니다. 그러나 프로세스 B의 설명자 fd0, fd1 및 fd9는 여전히 동일한 기본 커널 데이터 구조를 참조합니다. 프로세스 B의 epoll 설명자(fd9)는 프로세스 A와 동일한 관심 목록을 공유합니다. 위의 다이어그램에서 프로세스 483은 epoll 인스턴스와 파일 설명자 fd1, fd2, fd3, fd4 및 fd5를 등록했습니다.