"select" --- I/O 완료 대기
**************************

======================================================================

이 모듈은 대부분의 운영 체제에서 사용 가능한 "select()"와 "poll()" 함
수, Solaris와 파생 제품에서 사용 가능한 "devpoll()", 리눅스 2.5+ 에서
사용 가능한 "epoll()" 및 대부분의 BSD에서 사용 가능한 "kqueue()"에 대
한 액세스를 제공합니다. 윈도우에서는 소켓에서만 작동함에 유의하십시오;
다른 운영 체제에서는, 다른 파일 유형에서도 작동합니다 (특히, 유닉스에
서는 파이프에서도 작동합니다). 일반 파일에서 파일을 마지막으로 읽은 이
후에 파일이 커졌는지를 판별하기 위해 사용할 수는 없습니다.

참고:

  The "selectors" module allows high-level and efficient I/O
  multiplexing, built upon the "select" module primitives. Users are
  encouraged to use the "selectors" module instead, unless they want
  precise control over the OS-level primitives used.

가용성: not WASI.

이 모듈은 웹어셈블리에서 작동하지 않거나 제공되지 않습니다. 자세한 내
용은 웹어셈블리 플랫폼을 참조하세요.

모듈은 다음을 정의합니다:

exception select.error

   "OSError"의 폐지된 별칭.

   버전 3.3에서 변경: **PEP 3151**에 따라, 이 클래스는 "OSError"의 별
   칭이 되었습니다.

select.devpoll()

   Returns a "/dev/poll" polling object; see section /dev/poll polling
   objects below for the methods supported by devpoll objects.

   "devpoll()" 객체는 인스턴스 화 시점에 허용되는 파일 기술자 수에 연
   결됩니다. 프로그램이 이 값을 줄이면, "devpoll()"이 실패합니다. 프로
   그램이 이 값을 늘리면, "devpoll()"은 불완전한 활성 파일 기술자 리스
   트를 반환할 수 있습니다.

   새 파일 기술자는 상속 불가능합니다.

   Added in version 3.3.

   버전 3.4에서 변경: 새 파일 기술자는 이제 상속 불가능합니다.

   가용성: Solaris.

select.epoll(sizehint=-1, flags=0)

   Return an edge polling object, which can be used as Edge or Level
   Triggered interface for I/O events.

   *sizehint* informs epoll about the expected number of events to be
   registered.  It must be positive, or "-1" to use the default. It is
   only used on older systems where *epoll_create1(2)* is not
   available; otherwise it has no effect (though its value is still
   checked).

   *flags*는 폐지되었고 완전히 무시됩니다. 그러나, 제공되면, 값은 "0"
   이나 "select.EPOLL_CLOEXEC"여야 합니다. 그렇지 않으면 "OSError"가
   발생합니다.

   epolling 객체가 지원하는 메서드는 아래의 Edge and level trigger
   polling (epoll) objects 섹션을 참조하십시오.

   "epoll" 객체는 컨텍스트 관리자 프로토콜을 지원합니다: "with" 문에서
   사용될 때, 새 파일 기술자는 블록 끝에서 자동으로 닫힙니다.

   새 파일 기술자는 상속 불가능합니다.

   버전 3.3에서 변경: *flags* 매개 변수를 추가했습니다.

   버전 3.4에서 변경: "with" 문에 대한 지원이 추가되었습니다. 새로운
   파일 기술자는 이제 상속 불가능합니다.

   버전 3.4부터 폐지됨: *flags* 매개 변수. 이제 기본적으로
   "select.EPOLL_CLOEXEC"가 사용됩니다. 파일 기술자를 상속 가능하게 하
   려면 "os.set_inheritable()"을 사용하십시오.

   버전 3.15에서 변경: When CPython is built, this function may be
   disabled using "--disable-epoll".

   가용성: Linux >= 2.5.44.

select.poll()

   Returns a polling object, which supports registering and
   unregistering file descriptors, and then polling them for I/O
   events; see section Polling objects below for the methods supported
   by polling objects.

   가용성: Unix.

select.kqueue()

   Returns a kernel queue object; see section Kqueue objects below for
   the methods supported by kqueue objects.

   새 파일 기술자는 상속 불가능합니다.

   버전 3.4에서 변경: 새 파일 기술자는 이제 상속 불가능합니다.

   가용성: BSD, macOS.

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)

   Returns a kernel event object; see section Kevent objects below for
   the methods supported by kevent objects.

   가용성: BSD, macOS.

select.select(rlist, wlist, xlist, timeout=None)

   이것은 유닉스 "select()" 시스템 호출에 대한 간단한 인터페이스입니다
   . 처음 세 개의 인자는 '대기 가능한 객체(waitable objects)'의 이터러
   블입니다: 대기 가능한 객체는 파일 기술자를 나타내는 정수나 그런 정
   수를 반환하는 "fileno()"라는 매개 변수 없는 메서드를 가진 객체입니
   다:

   * *rlist*: 읽을 준비가 될 때까지 기다립니다

   * *wlist*: 쓰기 준비가 될 때까지 기다립니다

   * *xlist*: "예외 조건"을 기다립니다 (시스템에서 어떤 것들을 이러한
     조건으로 간주하는지는 매뉴얼 페이지를 참조하십시오)

   Empty iterables are allowed, but acceptance of three empty
   iterables is platform-dependent. (It is known to work on Unix but
   not on Windows.)  The optional *timeout* argument specifies a time-
   out in seconds; it may be a non-integer to specify fractions of
   seconds. When the *timeout* argument is omitted or "None", the
   function blocks until at least one file descriptor is ready.  A
   time-out value of zero specifies a poll and never blocks.

   반환 값은 준비된 객체의 리스트 3개입니다: 처음 세 인자의 부분 집합
   입니다. 파일 기술자가 준비되지 않고 시간제한에 도달하면, 세 개의 빈
   리스트가 반환됩니다.

   이터러블에서 허용되는 객체 형에는 파이썬 *파일 객체* (예를 들어
   "sys.stdin", 또는 "open()"이나 "os.popen()"에서 반환된 객체),
   "socket.socket()"에서 반환된 소켓 객체가 있습니다. 적절한 (단지 임
   의의 정수가 아니라 실제 파일 기술자를 반환하는) "fileno()" 메서드가
   있는 한, *래퍼 (wrapper)* 클래스를 직접 정의할 수도 있습니다.

   참고:

     윈도우에서 파일 객체는 허용되지 않지만, 소켓은 허용됩니다. 윈도우
     에서, 하부 "select()" 함수는 WinSock 라이브러리에서 제공되며,
     WinSock에서 생성되지 않은 파일 기술자를 처리하지 않습니다.

   버전 3.5에서 변경: 시그널 처리기가 "InterruptedError"를 발생시키는
   대신 예외를 발생시키는 경우(이유는 **PEP 475**를 참조하십시오)를 제
   외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수
   가 다시 시도됩니다.

   버전 3.15에서 변경: Accepts any real number as *timeout*, not only
   integer or float.

select.PIPE_BUF

   The minimum number of bytes which can be written without blocking
   to a pipe when the pipe has been reported as ready for writing by
   "select()", "poll()" or another interface in this module.  This
   doesn't apply to other kinds of file-like objects such as sockets.

   이 값은 POSIX에서 512 이상이 되도록 보장합니다.

   가용성: Unix

   Added in version 3.2.


"/dev/poll" polling objects
===========================

Solaris와 파생 제품에는 "/dev/poll"이 있습니다. "select()"는 *O*(*가장
높은 파일 기술자*)이고 "poll()"은 *O*(*파일 기술자 수*)이지만
"/dev/poll"은 *O*(*활성 파일 기술자*)입니다.

"/dev/poll" 동작은 표준 "poll()" 객체에 매우 가깝습니다.

devpoll.close()

   폴링 객체의 파일 기술자를 닫습니다.

   Added in version 3.4.

devpoll.closed

   폴링 객체가 닫혔으면 "True".

   Added in version 3.4.

devpoll.fileno()

   폴링 객체의 파일 기술자 번호를 반환합니다.

   Added in version 3.4.

devpoll.register(fd[, eventmask])

   폴링 객체에 파일 기술자를 등록합니다. 이후 "poll()" 메서드에 대한
   호출은 파일 기술자에 계류 중인 I/O 이벤트가 있는지 확인합니다. *fd*
   는 정수이거나, 정수를 반환하는 "fileno()" 메서드가 있는 객체일 수
   있습니다. 파일 객체는 "fileno()"를 구현하므로, 인자로도 사용할 수
   있습니다.

   *eventmask* is an optional bitmask describing the type of events
   you want to check for. The constants are the same as with "poll()"
   object. The default value is a combination of the constants
   "POLLIN", "POLLPRI", and "POLLOUT".

   경고:

     이미 등록된 파일 기술자를 등록하는 것은 에러가 아니지만, 결과는
     정의되지 않습니다. 적절한 액션은 먼저 unregister 하거나 modify 하
     는 것입니다. 이것은 "poll()"과 비교하여 중요한 차이점입니다.

devpoll.modify(fd[, eventmask])

   This method does an "unregister()" followed by a "register()". It
   is (a bit) more efficient than doing the same explicitly.

devpoll.unregister(fd)

   폴링 객체가 추적하는 파일 기술자를 제거합니다. "register()" 메서드
   와 마찬가지로, *fd*는 정수이거나 정수를 반환하는 "fileno()" 메서드
   가 있는 객체일 수 있습니다.

   등록되지 않은 파일 기술자를 제거하려고 하면 안전하게 무시됩니다.

devpoll.poll([timeout])

   등록된 파일 기술자 집합을 폴링하고, 보고할 이벤트나 에러가 있는 기
   술자에 대한 "(fd, event)" 2-튜플이 포함된 비어있을 수 있는 리스트를
   반환합니다. *fd*는 파일 기술자이고, *event*는 해당 기술자에 대해 보
   고된 이벤트에 대해 설정된 비트가 있는 비트 마스크입니다 --- 대기 중
   인 입력은 "POLLIN", 기술자에 쓸 수 있음을 나타내는 데는 "POLLOUT",
   등등. 빈 리스트는 시간제한을 초과하였고 보고할 이벤트가 있는 파일
   기술자가 없음을 나타냅니다. *timeout*이 제공되면, 시스템이 반환하기
   전에 이벤트를 기다리는 시간을 밀리초로 지정합니다. *timeout*을 생략
   하거나 -1이거나 "None"이면, 이 폴링 객체에 대한 이벤트가 있을 때까
   지 호출이 블록 됩니다.

   버전 3.5에서 변경: 시그널 처리기가 "InterruptedError"를 발생시키는
   대신 예외를 발생시키는 경우(이유는 **PEP 475**를 참조하십시오)를 제
   외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수
   가 다시 시도됩니다.

   버전 3.15에서 변경: Accepts any real number as *timeout*, not only
   integer or float.


Edge and level trigger polling (epoll) objects
==============================================

   https://linux.die.net/man/4/epoll

   The *eventmask* is a bit mask using the following constants:

   +---------------------------+--------------------------------------------------+
   | 상수                      | 의미                                             |
   |===========================|==================================================|
   | "EPOLLIN"                 | Available for read.                              |
   +---------------------------+--------------------------------------------------+
   | "EPOLLOUT"                | Available for write.                             |
   +---------------------------+--------------------------------------------------+
   | "EPOLLPRI"                | Urgent data for read.                            |
   +---------------------------+--------------------------------------------------+
   | "EPOLLERR"                | Error condition happened on the associated fd.   |
   +---------------------------+--------------------------------------------------+
   | "EPOLLHUP"                | Hang up happened on the associated fd.           |
   +---------------------------+--------------------------------------------------+
   | "EPOLLET"                 | Set Edge Trigger behavior, the default is Level  |
   |                           | Trigger behavior.                                |
   +---------------------------+--------------------------------------------------+
   | "EPOLLONESHOT"            | Set one-shot behavior. After one event is pulled |
   |                           | out, the fd is internally disabled.              |
   +---------------------------+--------------------------------------------------+
   | "EPOLLEXCLUSIVE"          | Wake only one epoll object when the associated   |
   |                           | fd has an event. The default (if this flag is    |
   |                           | not set) is to wake all epoll objects polling on |
   |                           | an fd.                                           |
   +---------------------------+--------------------------------------------------+
   | "EPOLLRDHUP"              | 스트림 소켓 반대편이 연결을 닫았거나 연결의 쓰기 |
   |                           | 절반을 종료했습니 다.                            |
   +---------------------------+--------------------------------------------------+
   | "EPOLLRDNORM"             | "EPOLLIN"과 동등합니다                           |
   +---------------------------+--------------------------------------------------+
   | "EPOLLRDBAND"             | 우선순위가 높은 데이터 대역을 읽을 수 있습니다.  |
   +---------------------------+--------------------------------------------------+
   | "EPOLLWRNORM"             | Equivalent to "EPOLLOUT".                        |
   +---------------------------+--------------------------------------------------+
   | "EPOLLWRBAND"             | 우선순위가 높은 데이터를 쓸 수 있습니다.         |
   +---------------------------+--------------------------------------------------+
   | "EPOLLMSG"                | 무시됩니다.                                      |
   +---------------------------+--------------------------------------------------+
   | "EPOLLWAKEUP"             | Prevents sleep during event waiting.             |
   +---------------------------+--------------------------------------------------+

   Added in version 3.6: "EPOLLEXCLUSIVE"가 추가되었습니다. 리눅스 커
   널 4.5 이상에서만 지원됩니다.

   Added in version 3.14: "EPOLLWAKEUP" was added. It's only supported
   by Linux Kernel 3.5 or later.

epoll.close()

   epoll 객체의 제어 파일 기술자를 닫습니다.

epoll.closed

   epoll 객체가 닫혔으면 "True".

epoll.fileno()

   제어 fd의 파일 기술자 번호를 반환합니다.

epoll.fromfd(fd)

   주어진 파일 기술자에서 epoll 객체를 만듭니다.

epoll.register(fd[, eventmask])

   Register a file descriptor *fd* with the epoll object.

epoll.modify(fd, eventmask)

   Modify a registered file descriptor *fd*.

epoll.unregister(fd)

   epoll 객체에서 등록된 파일 기술자를 제거합니다.

   버전 3.9에서 변경: 이 메서드는 더는 "EBADF" 에러를 무시하지 않습니
   다.

epoll.poll(timeout=None, maxevents=-1)

   Wait for events. If *timeout* is given, it specifies the length of
   time in seconds (may be non-integer) which the system will wait for
   events before returning.

   버전 3.5에서 변경: 시그널 처리기가 "InterruptedError"를 발생시키는
   대신 예외를 발생시키는 경우(이유는 **PEP 475**를 참조하십시오)를 제
   외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수
   가 다시 시도됩니다.

   버전 3.15에서 변경: Accepts any real number as *timeout*, not only
   integer or float.


Polling objects
===============

대부분의 유닉스 시스템에서 지원되는 "poll()" 시스템 호출은 동시에 많은
클라이언트에게 서비스를 제공하는 네트워크 서버에 더 나은 확장성을 제공
합니다. "select()"는 비트맵을 빌드하고, 관심 있는 fd에 대한 비트를 켠
후, 전체 비트 맵을 다시 선형으로 스캔해야 하지만, 이 시스템 호출은 관
심 있는 파일 기술자만 나열하면 되기 때문에 "poll()"은 더 잘 확장됩니다
. "select()"는 *O*(*가장 높은 파일 기술자*)이고 "poll()"은 *O*(*파일
기술자 수*)입니다.

poll.register(fd[, eventmask])

   폴링 객체에 파일 기술자를 등록합니다. 이후 "poll()" 메서드에 대한
   호출은 파일 기술자에 계류 중인 I/O 이벤트가 있는지 확인합니다. *fd*
   는 정수이거나, 정수를 반환하는 "fileno()" 메서드가 있는 객체일 수
   있습니다. 파일 객체는 "fileno()"를 구현하므로, 인자로도 사용할 수
   있습니다.

   *eventmask*는 확인할 이벤트 유형을 설명하는 선택적 비트 마스크이고,
   아래 표에 설명된 상수 "POLLIN", "POLLPRI" 및 "POLLOUT"의 조합일 수
   있습니다. 지정하지 않으면, 사용되는 기본값은 3가지 유형의 이벤트를
   모두 확인합니다.

   +---------------------+---------------------------------------------+
   | 상수                | 의미                                        |
   |=====================|=============================================|
   | "POLLIN"            | There is data to read.                      |
   +---------------------+---------------------------------------------+
   | "POLLPRI"           | There is urgent data to read.               |
   +---------------------+---------------------------------------------+
   | "POLLOUT"           | Ready for output: writing will not block.   |
   +---------------------+---------------------------------------------+
   | "POLLERR"           | Error condition of some sort.               |
   +---------------------+---------------------------------------------+
   | "POLLHUP"           | Hung up.                                    |
   +---------------------+---------------------------------------------+
   | "POLLRDHUP"         | Stream socket peer closed connection, or    |
   |                     | shut down writing half of connection.       |
   +---------------------+---------------------------------------------+
   | "POLLNVAL"          | Invalid request: descriptor not open.       |
   +---------------------+---------------------------------------------+

   이미 등록된 파일 기술자를 등록하는 것은 에러가 아니며, 기술자를 정
   확히 한 번 등록하는 것과 같은 효과가 있습니다.

poll.modify(fd, eventmask)

   이미 등록된 fd를 수정합니다. 이것은 "register(fd, eventmask)"와 같
   은 효과가 있습니다. 등록되지 않은 파일 기술자를 수정하려고 하면
   errno "ENOENT"로 "OSError" 예외가 발생합니다.

poll.unregister(fd)

   폴링 객체가 추적하는 파일 기술자를 제거합니다. "register()" 메서드
   와 마찬가지로, *fd*는 정수이거나 정수를 반환하는 "fileno()" 메서드
   가 있는 객체일 수 있습니다.

   등록되지 않은 파일 기술자를 제거하려고 하면 "KeyError" 예외가 발생
   합니다.

poll.poll([timeout])

   등록된 파일 기술자 집합을 폴링하고, 보고할 이벤트나 에러가 있는 기
   술자에 대한 "(fd, event)" 2-튜플이 포함된 비어있을 수 있는 리스트를
   반환합니다. *fd*는 파일 기술자이고, *event*는 해당 기술자에 대해 보
   고된 이벤트에 대해 설정된 비트가 있는 비트 마스크입니다 --- 대기 중
   인 입력은 "POLLIN", 기술자에 쓸 수 있음을 나타내는 데는 "POLLOUT",
   등등. 빈 리스트는 시간제한을 초과하였고 보고할 이벤트가 있는 파일
   기술자가 없음을 나타냅니다. *timeout*이 제공되면, 시스템이 반환하기
   전에 이벤트를 기다리는 시간을 밀리초로 지정합니다. *timeout*을 생략
   하거나 음수이거나 "None"이면, 이 폴링 객체에 대한 이벤트가 있을 때
   까지 호출이 블록 됩니다.

   버전 3.5에서 변경: 시그널 처리기가 "InterruptedError"를 발생시키는
   대신 예외를 발생시키는 경우(이유는 **PEP 475**를 참조하십시오)를 제
   외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수
   가 다시 시도됩니다.

   버전 3.15에서 변경: Accepts any real number as *timeout*, not only
   integer or float. If "ppoll()" function is available, *timeout* has
   a resolution of "1" ns ("1e-6" ms) instead of "1" ms.


Kqueue objects
==============

kqueue.close()

   kqueue 객체의 제어 파일 기술자를 닫습니다.

kqueue.closed

   kqueue 객체가 닫혔으면 "True".

kqueue.fileno()

   제어 fd의 파일 기술자 번호를 반환합니다.

kqueue.fromfd(fd)

   주어진 파일 기술자에서 kqueue 객체를 만듭니다.

kqueue.control(changelist, max_events[, timeout]) -> eventlist

   kevent에 대한 저수준 인터페이스

   * changelist는 kevent 객체의 이터러블 이거나 "None"이어야 합니다

   * max_events는 0이거나 양의 정수여야 합니다.

   * timeout in seconds (non-integers are possible); the default is
     "None", to wait forever

   버전 3.5에서 변경: 시그널 처리기가 "InterruptedError"를 발생시키는
   대신 예외를 발생시키는 경우(이유는 **PEP 475**를 참조하십시오)를 제
   외하고, 시그널에 의해 인터럽트 될 때 다시 계산된 시간제한으로 함수
   가 다시 시도됩니다.

   버전 3.15에서 변경: Accepts any real number as *timeout*, not only
   integer or float.


Kevent objects
==============

https://man.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident

   이벤트를 식별하는 데 사용되는 값. 해석은 필터에 따라 다르지만, 일반
   적으로 파일 기술자입니다. 생성자에서 ident 는 정수이거나 "fileno()"
   메서드가 있는 객체일 수 있습니다. kevent는 내부적으로 정수를 저장합
   니다.

kevent.filter

   커널 필터의 이름.

   +-----------------------------+-----------------------------------------------+
   | 상수                        | 의미                                          |
   |=============================|===============================================|
   | "KQ_FILTER_READ"            | Takes a descriptor and returns whenever there |
   |                             | is data available to read.                    |
   +-----------------------------+-----------------------------------------------+
   | "KQ_FILTER_WRITE"           | Takes a descriptor and returns whenever there |
   |                             | is data available to write.                   |
   +-----------------------------+-----------------------------------------------+
   | "KQ_FILTER_AIO"             | AIO requests.                                 |
   +-----------------------------+-----------------------------------------------+
   | "KQ_FILTER_VNODE"           | Returns when one or more of the requested     |
   |                             | events watched in *fflag* occurs.             |
   +-----------------------------+-----------------------------------------------+
   | "KQ_FILTER_PROC"            | Watch for events on a process ID.             |
   +-----------------------------+-----------------------------------------------+
   | "KQ_FILTER_NETDEV"          | Watch for events on a network device (not     |
   |                             | available on macOS).                          |
   +-----------------------------+-----------------------------------------------+
   | "KQ_FILTER_SIGNAL"          | Returns whenever the watched signal is        |
   |                             | delivered to the process.                     |
   +-----------------------------+-----------------------------------------------+
   | "KQ_FILTER_TIMER"           | Establishes an arbitrary timer.               |
   +-----------------------------+-----------------------------------------------+

kevent.flags

   필터 액션.

   +-----------------------------+------------------------------------------------+
   | 상수                        | 의미                                           |
   |=============================|================================================|
   | "KQ_EV_ADD"                 | Adds or modifies an event.                     |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_DELETE"              | Removes an event from the queue.               |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_ENABLE"              | Permits control() to return the event.         |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_DISABLE"             | Disables event.                                |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_ONESHOT"             | Removes event after first occurrence.          |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_CLEAR"               | Reset the state after an event is retrieved.   |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_SYSFLAGS"            | Internal event.                                |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_FLAG1"               | Internal event.                                |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_EOF"                 | Filter-specific EOF condition.                 |
   +-----------------------------+------------------------------------------------+
   | "KQ_EV_ERROR"               | See return values.                             |
   +-----------------------------+------------------------------------------------+

kevent.fflags

   Filter-specific flags.

   "KQ_FILTER_READ"와 "KQ_FILTER_WRITE" 필터 플래그:

   +------------------------------+----------------------------------------------+
   | 상수                         | 의미                                         |
   |==============================|==============================================|
   | "KQ_NOTE_LOWAT"              | Low water mark of a socket buffer.           |
   +------------------------------+----------------------------------------------+

   "KQ_FILTER_VNODE" 필터 플래그:

   +------------------------------+----------------------------------------------+
   | 상수                         | 의미                                         |
   |==============================|==============================================|
   | "KQ_NOTE_DELETE"             | *unlink()* was called.                       |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_WRITE"              | A write occurred.                            |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_EXTEND"             | The file was extended.                       |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_ATTRIB"             | An attribute was changed.                    |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_LINK"               | The link count has changed.                  |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_RENAME"             | The file was renamed.                        |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_REVOKE"             | Access to the file was revoked.              |
   +------------------------------+----------------------------------------------+

   "KQ_FILTER_PROC" 필터 플래그:

   +------------------------------+----------------------------------------------+
   | 상수                         | 의미                                         |
   |==============================|==============================================|
   | "KQ_NOTE_EXIT"               | The process has exited.                      |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_FORK"               | The process has called *fork()*.             |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_EXEC"               | The process has executed a new process.      |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_PCTRLMASK"          | Internal filter flag.                        |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_PDATAMASK"          | Internal filter flag.                        |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_TRACK"              | Follow a process across *fork()*.            |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_CHILD"              | Returned on the child process for            |
   |                              | *NOTE_TRACK*.                                |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_TRACKERR"           | Unable to attach to a child.                 |
   +------------------------------+----------------------------------------------+

   "KQ_FILTER_NETDEV" 필터 플래그 (맥 OS에서는 사용할 수 없습니다):

   +------------------------------+----------------------------------------------+
   | 상수                         | 의미                                         |
   |==============================|==============================================|
   | "KQ_NOTE_LINKUP"             | Link is up.                                  |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_LINKDOWN"           | Link is down.                                |
   +------------------------------+----------------------------------------------+
   | "KQ_NOTE_LINKINV"            | Link state is invalid.                       |
   +------------------------------+----------------------------------------------+

kevent.data

   Filter-specific data.

kevent.udata

   User-defined value.
