이벤트 루프는 libuv 기능의 중심 요소입니다. I/O 폴링을 관리하고 다양한 이벤트 소스에 따라 실행될 콜백을 스케줄링하는 역할을 합니다.
type uv_loop_t
Loop data type.
enum uv_run_mode
루프를 실행하는 데 사용되는 모드입니다. uv_run()
typedef enum {
UV_RUN_DEFAULT = 0,
UV_RUN_ONCE,
UV_RUN_NOWAIT
} uv_run_mode;
typedef void (uv_walk_cb)(uv_handle_t handle, void *arg)
uv_walk()에 전달되는 콜백에 대한 유형 정의 .
void *uv_loop_t.data
사용자가 정의한 임의의 데이터를 위한 공간입니다. libuv는 이 필드를 사용하지 않으며 건드리지 않습니다.
int uv_loop_init ( uv_loop_t * 루프 )
주어진 uv_loop_t 구조를 초기화합니다.
int uv_loop_configure ( uv_loop_t * 루프 , uv_loop_option 옵션 , ... )
버전 1.0.2의 새로운 기능.
추가 루프 옵션을 설정합니다. 명시되지 않은 경우 uv_run()을 처음 호출하기 전에 이 함수를 호출하는 것이 좋습니다. 성공 시 0을 반환하며, 실패 시 UV_E* 에러 코드를 반환합니다. UV_ENOSYS 처리를 대비해야 하며, 이는 플랫폼에서 해당 루프 옵션이 지원되지 않음을 의미합니다.지원되는 옵션:
- UV_LOOP_BLOCK_SIGNAL: 새 이벤트를 폴링할 때 신호를 차단합니다. 두 번째 인수는 uv_loop_configure()신호 번호입니다.
이 작업은 현재 SIGPROF 신호에 대해서만 구현되어 샘플링 프로파일러를 사용할 때 불필요한 웨이크업을 억제합니다. 다른 신호를 요청하면 UV_EINVAL로 실패합니다.- UV_METRICS_IDLE_TIME: 이벤트 루프가 이벤트 공급자에서 소비한 유휴 시간을 누적합니다.
이 옵션은 uv_metrics_idle_time()을 사용하는 데 필요합니다.버전 1.39.0에서 변경: UV_METRICS_IDLE_TIME 옵션이 추가되었습니다.
int uv_loop_close ( uv_loop_t * loop )
모든 내부 루프 리소스를 해제합니다. 루프가 실행을 완료하고 모든 열린 핸들과 요청이 닫혔을 때만 이 함수를 호출하거나 UV_EBUSY를 반환합니다. 이 함수가 반환된 후 사용자는 루프에 할당된 메모리를 해제할 수 있습니다.
uv_loop_t * uv_default_loop ( void )
초기화된 기본 루프를 반환합니다. 할당 실패 시 NULL을 반환할 수 있습니다.이 함수는 애플리케이션 전반에 걸쳐 전역 루프를 사용할 수 있도록 하는 편리한 방법일 뿐이며, 기본 루프는 uv_loop_init()으로 초기화된 다른 루프와 아무런 차이가 없습니다. 따라서 기본 루프도 uv_loop_close()로 닫아야 하며, 이를 통해 관련된 리소스를 해제할 수 있습니다.
경고
이 함수는 스레드 안전하지 않습니다.
int uv_run ( uv_loop_t * 루프 , uv_run_mode 모드 )
이 함수는 이벤트 루프를 실행합니다. 지정된 모드에 따라 다르게 작동합니다.
UV_RUN_DEFAULT: 더 이상 활성 및 참조 핸들 또는 요청이 없을 때까지 이벤트 루프를 실행합니다. uv_stop() 호출되었고 여전히 활성 핸들 또는 요청이 있는 경우 0이 아닌 값을 반환합니다. 다른 모든 경우에는 0을 반환합니다.
UV_RUN_ONCE: 한 번 i/o를 폴링합니다. 보류 중인 콜백이 없으면 이 함수가 차단됩니다. 완료되면(활성 핸들이나 요청이 남지 않음) 0을 반환하고, 더 많은 콜백이 예상되면(나중에 이벤트 루프를 다시 실행해야 함을 의미) 0이 아닌 값을 반환합니다.
UV_RUN_NOWAIT: 보류 중인 콜백이 없으면 한 번 i/o를 폴링하지만 차단하지 않습니다. 완료되면(활성 핸들이나 요청이 남지 않음) 0을 반환하고, 더 많은 콜백이 예상되면(나중에 이벤트 루프를 다시 실행해야 함을 의미) 0이 아닌 값을 반환합니다.
uv_run() 함수는 재진입 가능하지(reentrant) 않습니다. 콜백 내에서 호출해서는 안 됩니다.
int uv_loop_alive ( const uv_loop_t * loop )
루프에 참조된 활성 핸들, 활성 요청 또는 닫히는 핸들이 있으면 0이 아닌 값을 반환합니다.
void uv_stop ( uv_loop_t * loop )
이벤트 루프를 중지하여 uv_run()이 가능한 한 빨리 종료되도록 합니다. 이 함수가 호출된 경우, I/O로 차단되지 않습니다.
size_t uv_loop_size ( void )
uv_loop_t 구조체의 크기를 반환합니다. 구조체 레이아웃을 알고 싶지 않은 FFI 바인딩 작성자에게 유용합니다.
int uv_backend_fd ( const uv_loop_t * loop )
백엔드 파일 디스크립터를 가져옵니다. kqueue, epoll, event ports만 지원됩니다. 이 값은 uv_run(loop, UV_RUN_NOWAIT)와 함께 사용하여 한 스레드에서 폴링하고 다른 스레드에서 이벤트 루프의 콜백을 실행하는 데 사용할 수 있습니다. 예시는 test/test-embed.c를 참조하세요.
참고: 일부 플랫폼에서는 다른 kqueue 폴링 세트에 kqueue fd를 포함하는 것이 작동하지 않습니다. fd를 추가하는 것은 오류가 아니지만, 이벤트가 생성되지 않습니다.
int uv_backend_timeout ( const uv_loop_t * loop )
백엔드 타임아웃을 밀리초 단위로 반환합니다. 타임아웃이 없으면 -1을 반환합니다.
uint64_t uv_now ( const uv_loop_t * loop )
현재 타임스탬프를 밀리초 단위로 반환합니다. 타임스탬프는 이벤트 루프 틱이 시작될 때 캐시되며, 자세한 내용과 이유는 uv_update_time()을 참조하세요. 타임스탬프는 임의의 시간 기준으로 단조롭게 증가합니다. 시작 시점을 가정하지 마십시오.
참고: 밀리초 이하의 정밀도가 필요하다면 uv_hrtime()을 사용하세요.
void uv_update_time ( uv_loop_t * loop )
이벤트 루프의 "지금" 개념을 업데이트합니다. Libuv는 시간 관련 시스템 호출 수를 줄이기 위해 이벤트 루프 틱 시작 시 현재 시간을 캐시합니다.
이벤트 루프를 장시간 차단하는 콜백이 있는 경우가 아니면 일반적으로 이 함수를 호출할 필요가 없습니다. 여기서 "더 긴"이라는 표현은 다소 주관적이지만 아마도 밀리초 이상일 것입니다.
void uv_walk ( uv_loop_t 루프 , uv_walk_cb 워크_cb , void 인수 )
핸들 목록을 순회합니다. walk_cb는 주어진 arg와 함께 실행됩니다.
int uv_loop_fork ( uv_loop_t * loop )
fork(2) 시스템 호출 후 자식 프로세스에서 필요한 모든 커널 상태를 재초기화합니다. 이전에 시작된 워처는 자식 프로세스에서도 계속 시작됩니다. 부모 프로세스에서 생성된 모든 이벤트 루프에 대해 이 함수를 명시적으로 호출해야 하며, 자식에서 계속 사용할 계획이라면 기본 루프에도 호출해야 합니다. 이 함수는 자식 프로세스에서 uv_run()이나 루프를 사용하는 다른 API 함수를 호출하기 전에 반드시 호출해야 합니다. 그렇지 않으면 부모와 자식 모두에 중복 이벤트가 전달되거나 자식 프로세스가 중단될 수 있는 등 정의되지 않은 동작이 발생할 수 있습니다.
가능한 경우 부모에서 생성된 루프를 재사용하는 대신 자식 프로세스에서 새 루프를 생성하는 것이 좋습니다. fork 이후 자식 프로세스에서 생성된 새로운 루프는 이 함수를 사용할 필요가 없습니다.
주의: 이 함수는 실험적 기능입니다. 버그가 포함될 수 있으며, 변경 또는 제거될 수 있습니다. API 및 ABI 안정성은 보장되지 않습니다.
참고: 부모 프로세스에서 이벤트 루프에 디렉터리 FS 이벤트 핸들이 사용 중이었다면, 자식 프로세스에서는 가장 효율적인 FSEvent 구현을 사용할 수 없습니다. 대신, 자식 프로세스에서 디렉터리 FS 이벤트 핸들은 파일과 기타 kqueue 기반 시스템에서 사용되는 동일한 구현을 사용하게 됩니다.
주의: AIX 및 SunOS에서는 포크 당시 부모 프로세스에서 시작된 FS 이벤트 핸들이 자식 프로세스에서 이벤트를 전달하지 않으며, 이를 닫고 다시 시작해야 합니다. 다른 플랫폼에서는 추가 조치 없이 정상적으로 동작합니다.
주의: 이전에 uv_backend_fd()에서 반환된 값은 이제 무효화됩니다. 올바른 백엔드 파일 디스크립터를 확인하려면 해당 함수를 다시 호출해야 합니다.
void **uv_loop_get_data(const uv_loop_t loop)
loop->data를 반환합니다. (버전 1.19.0에서 추가됨)
void *uv_loop_set_data(uv_loop_t loop, void data)
loop->data를 data로 설정합니다. (버전 1.19.0에서 추가됨)