ASYNC_WAIT_CTX_new(3) - wariua/manpages-ko GitHub Wiki

NAME

ASYNC_WAIT_CTX_new, ASYNC_WAIT_CTX_free, ASYNC_WAIT_CTX_set_wait_fd, ASYNC_WAIT_CTX_get_fd, ASYNC_WAIT_CTX_get_all_fds, ASYNC_WAIT_CTX_get_changed_fds, ASYNC_WAIT_CTX_clear_fd - 비동기 μž‘μ—… μ™„λ£Œ λŒ€κΈ°λ₯Ό κ΄€λ¦¬ν•˜λŠ” ν•¨μˆ˜λ“€

SYNOPSIS

#include <openssl/async.h>

ASYNC_WAIT_CTX *ASYNC_WAIT_CTX_new(void);
void ASYNC_WAIT_CTX_free(ASYNC_WAIT_CTX *ctx);
int ASYNC_WAIT_CTX_set_wait_fd(ASYNC_WAIT_CTX *ctx, const void *key,
                               OSSL_ASYNC_FD fd,
                               void *custom_data,
                               void (*cleanup)(ASYNC_WAIT_CTX *, const void *,
                                               OSSL_ASYNC_FD, void *));
int ASYNC_WAIT_CTX_get_fd(ASYNC_WAIT_CTX *ctx, const void *key,
                          OSSL_ASYNC_FD *fd, void **custom_data);
int ASYNC_WAIT_CTX_get_all_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *fd,
                               size_t *numfds);
int ASYNC_WAIT_CTX_get_changed_fds(ASYNC_WAIT_CTX *ctx, OSSL_ASYNC_FD *addfd,
                                   size_t *numaddfds, OSSL_ASYNC_FD *delfd,
                                   size_t *numdelfds);
int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key);

DESCRIPTION

OpenSSLμ—μ„œ 비동기 λ™μž‘μ„ κ΅¬ν˜„ν•˜λŠ” 방식에 λŒ€ν•œ κ°œμš”λŠ” ASYNC_start_job(3)을 보라. ASYNC_WAIT_CTX κ°μ²΄λŠ” 비동기 "μ„Έμ…˜", 즉 κ΄€λ ¨ crypto μ—°μ‚°λ“€μ˜ 집합을 λ‚˜νƒ€λ‚Έλ‹€. 예λ₯Ό λ“€μ–΄ SSL μš©μ–΄λ‘œλŠ” SSL μ—°κ²°(connection)κ³Ό μΌλŒ€μΌλ‘œ λŒ€μ‘ν•˜κ²Œ λœλ‹€.

μ‘μš© μ½”λ“œμ—μ„œ ASYNC_WAIT_CTX_new()λ₯Ό μ΄μš©ν•΄ ASYNC_WAIT_CTXλ₯Ό μƒμ„±ν•œ 후에 ASYNC_start_job()을 ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€. (ASYNC_start_job(3) μ°Έκ³ .) μž‘μ—… μ‹œμž‘ λ•Œ κ·Έ μž‘μ—…κ³Ό ASYNC_WAIT_CTXκ°€ μ—°κ³„λœλ‹€. ASYNC_WAIT_CTXλŠ” ν•œλ²ˆμ— ASYNC_JOB ν•˜λ‚˜μ—λ§Œ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, ASYNC_JOB이 μ™„λ£Œλœ ν›„μ—λŠ” λ‹€λ₯Έ ASYNC_JOB에 μž¬μ‚¬μš©ν•  수 μžˆλ‹€. μ„Έμ…˜μ΄ μ™„λ£Œλμ„ λ•Œ (κ°€λ Ή SSL 연결이 λ‹«ν˜”μ„ λ•Œ) μ‘μš© μ½”λ“œμ—μ„œ ASYNC_WAIT_CTX_free()둜 정리λ₯Ό ν•œλ‹€.

ASYNC_WAIT_CTX에 "λŒ€κΈ°" 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ„ 연계할 수 μžˆλ‹€. ASYNC_WAIT_CTX_get_all_fds()λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ ctx λ§€κ°œλ³€μˆ˜μ— ASYNC_WAIT_CTX에 λŒ€ν•œ 포인터λ₯Ό μ£Όλ©΄ κ·Έ μž‘μ—…μ— μ—°κ³„λœ λŒ€κΈ° 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ„ *fd둜 λ°˜ν™˜ν•œλ‹€. λ°˜ν™˜ν•˜λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ˜ 수λ₯Ό *numfds에 μ €μž₯ν•œλ‹€. λͺ¨λ“  파일 λ””μŠ€ν¬λ¦½ν„°λ“€μ„ 받기에 μΆ©λΆ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό *fd에 ν• λ‹Ήν•˜λŠ” 것은 호좜자의 μ±…μž„μ΄λ‹€. fdλ₯Ό NULL κ°’μœΌλ‘œ ν•΄μ„œ ASYNC_WAIT_CTX_get_all_fds()λ₯Ό ν˜ΈμΆœν•˜λ©΄ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•Šμ§€λ§Œ *numfdsλŠ” μ±„μš΄λ‹€. λ”°λΌμ„œ 보톡은 μ‘μš© μ½”λ“œμ—μ„œ 이 ν•¨μˆ˜λ₯Ό 두 번 ν˜ΈμΆœν•˜κ²Œ λœλ‹€. ν•œ λ²ˆμ€ fd 개수λ₯Ό μ–»κΈ° μœ„ν•΄μ„œμ΄κ³  μΆ©λΆ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³ μ„œ λ‹€μ‹œ ν˜ΈμΆœν•œλ‹€. 비동기 엔진을 ν•œ 개만 μ“°κ³  μžˆλ‹€λ©΄ 이 호좜이 항상 fd ν•œ 개만 λ°˜ν™˜ν•  것이닀. 비동기 엔진을 μ—¬λŸ¬ 개 μ“°κ³  μžˆλ‹€λ©΄ μ—¬λŸ¬ 개λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€.

ASYNC_WAIT_CTX_get_changed_fds() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ ASYNC_start_job()이 ASYNC_PAUSEλ₯Ό λ°˜ν™˜ν–ˆλ˜ λ§ˆμ§€λ§‰ 호좜 μ‹œμ  이후 (ASYNC_PAUSE κ²°κ³Όλ₯Ό 받은 적이 μ—†λ‹€λ©΄ ASYNC_WAIT_CTXλ₯Ό μƒμ„±ν•œ 이후) λ³€κ²½λœ fdκ°€ μžˆλŠ”μ§€ 탐지할 수 μžˆλ‹€. μΆ”κ°€λ˜κ³  μ‚­μ œλœ fd 개수 각각을 numaddfds 및 numdelfds λ§€κ°œλ³€μˆ˜μ— μ±„μš΄λ‹€. 그리고 μΆ”κ°€λ˜κ³  μ‚­μ œλœ fdλ“€μ˜ λͺ©λ‘μ„ 각각 *addfd 및 *delfd에 μ±„μš΄λ‹€. ASYNC_WAIT_CTX_get_all_fds()μ—μ„œμ²˜λŸΌ 두 λ§€κ°œλ³€μˆ˜ 각각이 NULL일 수 있으며, NULL이 μ•„λ‹Œ 경우 μΆ©λΆ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜λŠ” 것은 호좜자의 μ±…μž„μ΄λ‹€.

비동기 지원 μ½”λ“œ(κ°€λ Ή μ—”μ§„)λ₯Ό κ΅¬ν˜„ν•  λ•ŒλŠ” 자주 λ°”λ€ŒλŠ” fd듀이 "μ—ŽμΉ˜λ½λ’€μΉ˜λ½" ν•˜λŠ” κ±Έ 쀄이도둝 ASYNC_WAIT_CTX의 수λͺ… λ™μ•ˆ μ•ˆμ •μ μΈ fdλ₯Ό λ°˜ν™˜ν•˜λŠ” 게 μ’‹λ‹€. ν•˜μ§€λ§Œ μ‘μš©μ—κ²ŒλŠ” 이에 λŒ€ν•œ μ–΄λ–€ 보μž₯도 μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ‘μš©μ—μ„œ selectλ‚˜ poll 같은 μ‹œμŠ€ν…œ ν•¨μˆ˜ ν˜ΈμΆœμ„ μ΄μš©ν•΄ 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ "읽기" μ€€λΉ„κ°€ 되기λ₯Ό 기닀릴 수 μžˆλ‹€. ("읽기" μ€€λΉ„κ°€ λ˜λŠ” 것은 μž‘μ—…μ„ μž¬κ°œν•΄μ•Ό ν•œλ‹€λŠ” ν‘œμ‹œμ΄λ‹€.) μ œκ³΅λ°›λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°κ°€ μ—†λ‹€λ©΄ μ‘μš©μ—μ„œ 주기적으둜 μž‘μ—…μ„ μž¬μ‹œμž‘ν•˜λŠ” λ°©μ‹μœΌλ‘œ μž‘μ—…μ΄ 싀행을 μ΄μ–΄κ°ˆ μ€€λΉ„κ°€ λ˜μ–΄ μžˆλŠ”μ§€ 확인해 봐야 ν•  것이닀.

비동기 지원 μ½”λ“œ(κ°€λ Ή μ—”μ§„)μ—μ„œ ASYNC_get_wait_ctx(3)λ₯Ό 톡해 μž‘μ—…μ˜ ν˜„μž¬ ASYNC_WAIT_CTXλ₯Ό 얻을 수 있고 ASYNC_WAIT_CTX_set_wait_fd() 호좜둜 λŒ€κΈ°μ— μ‚¬μš©ν•  파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€. 보톡은 μ—”μ§„μ—μ„œ ASYNC_pause_job()을 ν˜ΈμΆœν•˜κΈ° 직전에 κ·Έλ ‡κ²Œ ν•˜λ©° 말단 μ‚¬μš©μžκ°€ ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. ASYNC_WAIT_CTX_get_fd()λ₯Ό μ΄μš©ν•΄ 기쑴의 연계 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό 얻을 수 있으며 ASYNC_WAIT_CTX_clear_fd()λ₯Ό μ΄μš©ν•΄ 연계λ₯Ό 없앨 수 μžˆλ‹€. 두 ν•¨μˆ˜ λͺ¨λ‘ key 값을 ν•„μš”λ‘œ ν•˜λŠ”λ°, μ΄λŠ” κ·Έ 비동기 지원 μ½”λ“œμ— κ³ μœ ν•œ 값이닀. μœ μΌν•œ μ–΄λ–€ 값도 κ°€λŠ₯ν•˜μ§€λ§Œ 엔진에 λŒ€ν•œ ENGINE *κ°€ 쒋은 후보가 될 것이닀. custom_data λ§€κ°œλ³€μˆ˜μ—λŠ” μ–΄λ–€ 값도 κ°€λŠ₯ν•˜λ©° 이후 ASYNC_WAIT_CTX_get_fd() ν˜ΈμΆœμ—μ„œ κ·Έ 값을 λ°˜ν™˜ν•œλ‹€. ASYNC_WAIT_CTX_set_wait_fd() ν•¨μˆ˜μ—μ„œλŠ” "정리" 루틴에 λŒ€ν•œ 포인터도 κΈ°λŒ€ν•œλ‹€. NULL일 μˆ˜λ„ μžˆμ§€λ§Œ 제곡 μ‹œμ—λŠ” κ·Έ ASYNC_WAIT_CTXκ°€ ν•΄μ œλ  λ•Œ μžλ™μœΌλ‘œ ν˜ΈμΆœλ˜λ―€λ‘œ μ—”μ§„μ—μ„œ fdλ‚˜ 기타 μžμ›μ„ 닫을 κΈ°νšŒκ°€ λœλ‹€. μ°Έκ³ : ASYNC_WAIT_CTX_clear_fd() ν˜ΈμΆœμ„ 톡해 fdλ₯Ό 직접 μ—†μ• λŠ” κ²½μš°μ—λŠ” "정리" 루틴이 ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.

일반적인 μ‚¬μš©λ‘€λ‘œλŠ” 비동기 지원 엔진이 μžˆμ„ 수 μžˆλ‹€. 일단 μ‚¬μš©μž μ½”λ“œμ—μ„œ μ•”ν˜Έ 연산을 κ°œμ‹œν•œλ‹€. 엔진이 κ·Έ 연산을 λΉ„λ™κΈ°μ μœΌλ‘œ κ°œμ‹œν•˜κ³ μ„œ ASYNC_WAIT_CTX_set_wait_fd()에 이어 ASYNC_pause_job()을 ν˜ΈμΆœν•΄μ„œ μ‚¬μš©μž μ½”λ“œλ‘œ μ œμ–΄λ₯Ό λŒλ €μ€€λ‹€. 그러면 μ‚¬μš©μž μ½”λ“œμ—μ„œλŠ” λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ κ·Έ λŒ€κΈ° 파일 λ””μŠ€ν¬λ¦½ν„°μ— "select" λ‚΄μ§€ 기타 μœ μ‚¬ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ μž‘μ—…μ΄ μ€€λΉ„ μƒνƒœκ°€ 되기λ₯Ό 기닀릴 수 μžˆλ‹€. 그리고 μ—”μ§„μ—μ„œλŠ” λŒ€κΈ° 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό "읽기 κ°€λŠ₯"으둜 λ§Œλ“€μ–΄μ„œ μž‘μ—…μ„ μž¬κ°œν•΄μ•Ό ν•œλ‹€λŠ” μ‹ ν˜Έλ₯Ό 쀄 수 μžˆλ‹€. 싀행이 재개되면 μ—”μ§„μ—μ„œλŠ” λŒ€κΈ° 파일 λ””μŠ€ν¬λ¦½ν„°μ—μ„œ κΉ¨μš°λŠ” μ‹ ν˜Έλ₯Ό μ—†μ• μ•Ό ν•œλ‹€.

RETURN VALUES

ASYNC_WAIT_CTX_new()λŠ” μƒˆλ‘œ ν• λ‹Ήν•œ ASYNC_WAIT_CTX에 λŒ€ν•œ 포인터λ₯Ό λ°˜ν™˜ν•˜λ©° 였λ₯˜ μ‹œ NULL을 λ°˜ν™˜ν•œλ‹€.

ASYNC_WAIT_CTX_set_wait_fd(), ASYNC_WAIT_CTX_get_fd(), ASYNC_WAIT_CTX_get_all_fds(), ASYNC_WAIT_CTX_get_changed_fds(), ASYNC_WAIT_CTX_clear_fd()λŠ” λͺ¨λ‘ 성곡 μ‹œ 1을 λ°˜ν™˜ν•˜κ³  였λ₯˜ μ‹œ 0을 λ°˜ν™˜ν•œλ‹€.

NOTES

μœˆλ„μš° ν”Œλž«νΌμ—μ„œλŠ” openssl/async.h 헀더에 ν•„μš”ν•œ λͺ‡ κ°€μ§€ νƒ€μž…λ“€μ΄ 보톡 windows.hλ₯Ό ν¬ν•¨μ‹œμΌœμ•Ό μ‚¬μš© κ°€λŠ₯ν•΄μ§„λ‹€. 그런데 κ°€μž₯ λ¨Όμ € ν¬ν•¨μ‹œν‚€λŠ” 헀더듀 쀑 ν•˜λ‚˜μΈ windows.hλ₯Ό μ–Έμ œ ν¬ν•¨μ‹œν‚¬μ§€λ₯Ό μ‘μš© κ°œλ°œμžκ°€ ν†΅μ œν•  수 μžˆμ–΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€. λ”°λΌμ„œ async.h에 μ•žμ„œ windows.hλ₯Ό ν¬ν•¨μ‹œν‚€λŠ” 것을 μ‘μš© 개발자의 μ±…μž„μœΌλ‘œ κ·œμ •ν•œλ‹€.

SEE ALSO

crypto(7), ASYNC_start_job(3)

HISTORY

OpenSSL 1.1.0μ—μ„œ ASYNC_WAIT_CTX_new(), ASYNC_WAIT_CTX_free(), ASYNC_WAIT_CTX_set_wait_fd(), ASYNC_WAIT_CTX_get_fd(), ASYNC_WAIT_CTX_get_all_fds(), ASYNC_WAIT_CTX_get_changed_fds(), ASYNC_WAIT_CTX_clear_fd()κ°€ 처음 μΆ”κ°€λ˜μ—ˆλ‹€.

COPYRIGHT

Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the OpenSSL license (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at https://www.openssl.org/source/license.html.


2017-12-31

⚠️ **GitHub.com Fallback** ⚠️