kqueue 예제

앞서 언급한 예제를 포함하여 더 많은 kqueue 예제는 여기에서 찾을 수 있습니다. A-1 을 나열하는 간단한 예는 커널 큐를 사용하여 단일 파일을 모니터링하는 방법을 보여 주는 간단한 예입니다. 디렉터리를 모니터링하는 보다 복잡한 예제의 경우 FileNotification 샘플 코드를 참조하십시오. Kqueue는 “커널 큐”를 의미합니다. API는 프로세스에 커널 공간에서 이벤트 큐를 만들고 특정 종류의 이벤트를 구독하는 방법을 제공합니다. 그것은 대략 게시 – 구독 시스템입니다! 커널은 pub-sub 서버의 역할을 하고, 프로세스는 pub-sub 클라이언트역할을 하며, 프로세스는 kqueue를 생성하여 서버에 연결되고, 프로세스는 이벤트를 일치시킬 수 있는 “필터”를 등록하여 이벤트에 가입하고, 커널 및 프로세스는 이벤트를 게시할 수 있습니다. 큐. kqueue의 문서는 꽤 괜찮은 하지만 그것은 몇 가지 예 부족. 주요 매뉴얼 페이지 (kqueue(9)와 kevent (9)를 읽은 후 어떻게 작동하는지 잘 모르기 때문에 그 동작을 확인하기 위해 테스트 프로그램을 작성해야했습니다.

파일 시스템 이벤트는 디렉터리 수준 세분성을 사용하여 변경 사항에 대한 알림을 제공하기 위한 것입니다. 대부분의 경우 이것으로 충분합니다. 그러나 경우에 따라 세밀한 세부성으로 알림을 받아야 할 수도 있습니다. 예를 들어 단일 파일에 대한 변경 내용만 모니터링해야 할 수 있습니다. 이를 위해 커널 큐(kqueue) 알림 시스템이 더 적합합니다. 결과를 해석합니다. kevent(2)가 0보다 큰 숫자를 반환한 경우 출력 벡터를 검사하고 수신된 이벤트를 확인해야 합니다. 각 필터에는 결과에 대한 의미 체계가 있습니다. 예를 들어, fflags 필드에서 모니터링하는 조건 목록을 취하고 필터를 트리거한 조건만 포함하도록 수정하는 EVFILT_VNODE 필터를 사용하고 있습니다. 지금까지 나는 그것이 가능하다고 생각하지만, 당신의 예에서 당신은 “소켓이 자동으로 커널에 의해 kQ에서 제거됩니다”.라고 썼다. http://repo.or.cz/w/eleutheria.git/blob_plain/master:/kqueue/kqdir.c 예제 코드에 버그가 있습니다.

모니터링해야 하는 파일디렉토리의 첫 번째 파일을 건너뜁니다. Kqueue는 응용 프로그램이 다양한 이벤트/조건에 대한 관심을 등록하고 효율적인 방식으로 이러한 알림에 대한 알림을 제공하는 표준 API를 제공합니다. 확장 가능하고 유연하며 안정적이며 정확하도록 설계되었습니다. 세 번째 인수인 필터에는 결과를 표시하려는 커널 필터의 이름이 포함됩니다. 예를 들어 EVFILT_VNODE를 사용하여 파일의 vnode 작업을 모니터링할 수 있습니다. 반대로 플래그가 kevent에 설정되어 있는지 확인하려면 AND`ing을 각각의 값으로 설정합니다. 예를 들어 이러한 개념을 명확하고 수동 페이지의 도움으로 쉽게 해석할 수 있습니다. 당분간 우리는 kevent 회원의 나머지 부분에 대해 자세히 설명하지 않을 것입니다. 대신 읽기 보류 중인 데이터에 대 한 소켓을 모니터링 해야 하는 경우 를 살펴보겠습니다: 하나는 비 NULL 0 시간 스펙 구조를 사용 하는 경우 kevent() 즉시 반환 됩니다., 일반 설문 조사 메서드의 수준에 성능을 가져옵니다. kevent는 쌍으로 식별됩니다.

ID는 모니터링하려는 항목에 따라 설명자(파일, 소켓, 스트림), 프로세스 ID 또는 신호 번호일 수 있습니다. 필터는 각 이벤트를 처리하는 데 사용되는 커널 필터를 식별합니다.