sigwaitinfo(2) - wariua/manpages-ko GitHub Wiki

NAME

sigwaitinfo, sigtimedwait, rt_sigtimedwait - λ™κΈ°μ μœΌλ‘œ λŒ€κΈ° μ‹œκ·Έλ„ 기닀리기

SYNOPSIS

#include <signal.h>

int sigwaitinfo(const sigset_t *set, siginfo_t *info);

int sigtimedwait(const sigset_t *set, siginfo_t *info,
                 const struct timespec *timeout);

glibc κΈ°λŠ₯ 확인 맀크둜 μš”κ±΄ (feature_test_macros(7) μ°Έκ³ ):

sigwaitinfo(), sigtimedwait():
_POSIX_C_SOURCE >= 199309L

DESCRIPTION

sigwaitinfo()λŠ” set의 μ‹œκ·Έλ„λ“€ 쀑 ν•˜λ‚˜κ°€ 미처리 μƒνƒœμΌ λ•ŒκΉŒμ§€ 호좜 μŠ€λ ˆλ“œμ˜ 싀행을 μ€‘μ§€ν•œλ‹€. (set의 μ‹œκ·Έλ„λ“€ 쀑 ν•˜λ‚˜κ°€ 이미 호좜 μŠ€λ ˆλ“œμ—κ²Œ 미처리 μƒνƒœμ΄λ©΄ sigwaitinfo()κ°€ μ¦‰μ‹œ λ°˜ν™˜ν•˜κ²Œ λœλ‹€.)

sigwaitinfo()λŠ” 미처리 μ‹œκ·Έλ„ μ§‘ν•©μ—μ„œ κ·Έ μ‹œκ·Έλ„μ„ μ œκ±°ν•˜κ³ μ„œ μ‹œκ·Έλ„ 번호λ₯Ό ν•¨μˆ˜ 결과둜 λ°˜ν™˜ν•œλ‹€. info μΈμžκ°€ NULL이 μ•„λ‹ˆλΌλ©΄ κ·Έ 버퍼λ₯Ό μ΄μš©ν•΄ μ‹œκ·Έλ„μ— λŒ€ν•œ 정보λ₯Ό 담은 siginfo_t νƒ€μž… ꡬ쑰체(sigaction(2) μ°Έκ³ )λ₯Ό λ°˜ν™˜ν•œλ‹€.

set에 μžˆλŠ” μ‹œκ·Έλ„ μ—¬λŸ¬ κ°œκ°€ ν˜ΈμΆœμžμ—κ²Œ 미처리 μƒνƒœμΈ 경우 sigwaitinfo()κ°€ κ°€μ Έμ˜€λŠ” μ‹œκ·Έλ„μ€ 일반적인 μˆœμ„œ κ·œμΉ™μ— 따라 μ •ν•΄μ§„λ‹€. 더 μžμ„Έν•œ λ‚΄μš©μ€ signal(7)을 보라.

sigtimedwait()은 sigwaitinfo()와 μ •ν™•νžˆ 같은 μ‹μœΌλ‘œ λ™μž‘ν•˜λ˜ μΆ”κ°€λ‘œ timeout μΈμžκ°€ μžˆμ–΄μ„œ μ‹œκ·Έλ„μ„ 기닀리며 μŠ€λ ˆλ“œλ₯Ό 쀑지해 λ‘˜ μ‹œκ°„μ„ μ§€μ •ν•œλ‹€. (이 μ‹œκ°„μ„ μ‹œμŠ€ν…œ 클럭 해상도에 따라 올림 ν•˜κ²Œ 되며 컀널 μŠ€μΌ€μ€„λ§ 지연도 있기 λ•Œλ¬Έμ— κ·Έ μ‹œκ°„μ„ μ•½κ°„ λ„˜κΈΈ μˆ˜λ„ μžˆλ‹€.) 이 μΈμžλŠ” λ‹€μŒ νƒ€μž…μ΄λ‹€.

struct timespec {
    time_t   tv_sec;        /* 초 */
    long     tv_nsec;       /* λ‚˜λ…Έμ΄ˆ */
};

이 ꡬ쑰체의 두 ν•„λ“œ λͺ¨λ‘λ₯Ό 0으둜 μ§€μ •ν•˜λ©΄ 검사λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것이닀. 즉, ν˜ΈμΆœμžμ—κ²Œ λ―Έμ²˜λ¦¬μ˜€λ˜ μ‹œκ·Έλ„μ— λŒ€ν•œ 정보λ₯Ό κ°€μ§€κ³ , λ˜λŠ” set의 μ–΄λŠ μ‹œκ·Έλ„λ„ λ―Έμ²˜λ¦¬κ°€ μ•„λ‹ˆμ—ˆμœΌλ©΄ 였λ₯˜μ™€ ν•¨κ»˜ sigtimedwait()이 μ¦‰μ‹œ λ°˜ν™˜ν•œλ‹€.

RETURN VALUE

성곡 μ‹œ sigwaitinfo()와 sigtimedwait() λͺ¨λ‘ μ‹œκ·Έλ„ 번호λ₯Ό (즉 0보닀 큰 값을) λ°˜ν™˜ν•œλ‹€. μ‹€νŒ¨ μ‹œ 두 호좜 λͺ¨λ‘ -1을 λ°˜ν™˜ν•˜λ©° 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λ„λ‘ errnoλ₯Ό μ„€μ •ν•œλ‹€.

ERRORS

EAGAIN
sigtimedwait()에 μ§€μ •ν•œ timeout κΈ°κ°„ 내에 set의 μ–΄λ–€ μ‹œκ·Έλ„λ„ 미처리 μƒνƒœκ°€ λ˜μ§€ μ•Šμ•˜λ‹€.
EINTR
μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ— μ˜ν•΄ 기닀리기가 μ€‘λ‹¨λ˜μ—ˆλ‹€. signal(7) μ°Έκ³ . (이 ν•Έλ“€λŸ¬λŠ” set에 μžˆλŠ” 것 μ™Έμ˜ μ‹œκ·Έλ„μ— λŒ€ν•œ 것이닀.)
EINVAL
timeout이 μœ νš¨ν•˜μ§€ μ•Šλ‹€.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008.

NOTES

일반적 μ‚¬μš© λ°©μ‹μ—μ„œλŠ” 호좜 ν”„λ‘œκ·Έλž¨μ΄ sigprocmask(2)λ₯Ό 미리 ν˜ΈμΆœν•΄μ„œ set μ•ˆμ˜ μ‹œκ·Έλ„λ“€μ„ λ§‰μœΌλ©° (κ·Έλž˜μ„œ μ΄μ–΄μ§€λŠ” sigwaitinfo() λ‚΄μ§€ sigtimedwait() 호좜과의 μ‚¬μ΄μ—μ„œ μ‹œκ·Έλ„μ΄ 미처리 μƒνƒœκ°€ λ˜λŠ” 경우 κΈ°λ³Έ μ²˜λ¦¬κ°€ μΌμ–΄λ‚˜μ§€ μ•Šλ„λ‘ ν•˜λ©°), κ·Έ μ‹œκ·Έλ„λ“€μ— λŒ€ν•œ ν•Έλ“€λŸ¬λ₯Ό μ„€μ •ν•˜μ§€ μ•ŠλŠ”λ‹€. 닀쀑 μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” sigwaitinfo() λ‚΄μ§€ sigtimedwait()을 ν˜ΈμΆœν•œ μŠ€λ ˆλ“œ μ™Έμ˜ μŠ€λ ˆλ“œμ—μ„œ κΈ°λ³Έ 처리 방식에 따라 μ‹œκ·Έλ„μ΄ μ²˜λ¦¬λ˜λŠ” 것을 막기 μœ„ν•΄ λͺ¨λ“  μŠ€λ ˆλ“œμ—μ„œ μ‹œκ·Έλ„μ„ 막아야 ν•œλ‹€.

μ–΄λ–€ μŠ€λ ˆλ“œμ— 미처리 μƒνƒœμΈ μ‹œκ·Έλ„λ“€μ˜ 집합은 νŠΉλ³„νžˆ κ·Έ μŠ€λ ˆλ“œμ—κ²Œ 미처리인 μ‹œκ·Έλ„λ“€κ³Ό ν”„λ‘œμ„ΈμŠ€ μ „μ²΄μ—κ²Œ 미처리인 μ‹œκ·Έλ„λ“€μ˜ 합집합이닀 (signal(7) μ°Έκ³ ).

SIGKILL 및 SIGSTOP을 κΈ°λ‹€λ¦¬λ €λŠ” μ‹œλ„λŠ” 쑰용히 λ¬΄μ‹œλœλ‹€.

ν•œ ν”„λ‘œμ„ΈμŠ€μ˜ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ sigwaitinfo() λ‚΄μ§€ sigtimedwait()μ—μ„œ 같은 μ‹œκ·Έλ„(λ“€)을 기닀리며 블둝 λ˜μ–΄ μžˆλŠ” κ²½μš°μ— ν”„λ‘œμ„ΈμŠ€ 전체에 λŒ€ν•œ μ‹œκ·Έλ„μ΄ λ―Έμ²˜λ¦¬κ°€ 되면 κ·Έ μŠ€λ ˆλ“œλ“€ 쀑 μ •ν™•νžˆ ν•œ κ°œκ°€ μ‹€μ œλ‘œ μ‹œκ·Έλ„μ„ λ°›κ²Œ λœλ‹€. μ–΄λŠ μŠ€λ ˆλ“œκ°€ μ‹œκ·Έλ„μ„ λ°›λŠ”μ§€λŠ” μ •ν•΄μ Έ μžˆμ§€ μ•Šλ‹€.

sigwaitinfo() λ‚΄μ§€ sigtimedwait()은 λΉ„μœ νš¨ λ©”λͺ¨λ¦¬ μ£Όμ†Œ μ ‘κ·ΌμœΌλ‘œ μΈν•œ SIGSEGVλ‚˜ μ‚°μˆ  였λ₯˜λ‘œ μΈν•œ SIGFPE처럼 λ™κΈ°μ μœΌλ‘œ μƒμ„±λœ μ‹œκ·Έλ„μ„ λ°›λŠ” λ°λŠ” μ“Έ 수 μ—†λ‹€. 그런 μ‹œκ·Έλ„λ“€μ€ μ‹œκ·Έλ„ ν•Έλ“€λŸ¬λ₯Ό ν†΅ν•΄μ„œλ§Œ μž‘μ„ 수 μžˆλ‹€.

POSIXμ—μ„œλŠ” sigtimedwait()의 timeout μΈμžμ—μ„œ NULL κ°’μ˜ 의미λ₯Ό λͺ…μ„Έ μ•ˆ 된 κ²ƒμœΌλ‘œ 남겨두어 이λ₯Ό sigwaitinfo() 호좜과 같은 의미둜 ν•˜λŠ” κ°€λŠ₯성을 ν—ˆμš©ν•˜λ©°, μ‹€μ œλ‘œ λ¦¬λˆ…μŠ€μ—μ„œ κ·Έλ ‡κ²Œ ν•œλ‹€.

C 라이브러리/컀널 차이

λ¦¬λˆ…μŠ€μ—μ„œ sigwaitinfo()λŠ” sigtimedwait() μœ„μ— κ΅¬ν˜„λœ 라이브러리 ν•¨μˆ˜μ΄λ‹€.

glibc의 sigwaitinfo() 및 sigtimedwait() 래퍼 ν•¨μˆ˜μ—μ„œλŠ” NPTL μŠ€λ ˆλ”© κ΅¬ν˜„ λ‚΄λΆ€μ—μ„œ μ“°λŠ” 두 κ°€μ§€ μ‹€μ‹œκ°„ μ‹œκ·Έλ„μ„ κΈ°λ‹€λ¦¬λ €λŠ” μ‹œλ„λ₯Ό 쑰용히 λ¬΄μ‹œν•œλ‹€.

μ›λž˜ λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œ 호좜의 이름은 sigtimedwait()μ΄μ—ˆλ‹€. ν•˜μ§€λ§Œ λ¦¬λˆ…μŠ€ 2.2에 μ‹€μ‹œκ°„ μ‹œκ·Έλ„μ΄ μΆ”κ°€λ˜λ©΄μ„œ κ·Έ μ‹œμŠ€ν…œ 호좜이 μ§€μ›ν•˜λ˜ κ³ μ • 크기 32λΉ„νŠΈ sigset_t νƒ€μž…μ΄ λ”λŠ” μš©λ„μ— λ§žμ§€ μ•Šκ²Œ λ˜μ—ˆλ‹€. 그에 따라 ν™•μž₯된 sigset_t νƒ€μž…μ„ μ§€μ›ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ μ‹œμŠ€ν…œ 호좜 rt_sigtimedwait()이 μΆ”κ°€λ˜μ—ˆλ‹€. μƒˆ μ‹œμŠ€ν…œ ν˜ΈμΆœμ—μ„œ λ„€ 번째 인자둜 size_t sigsetsizeλ₯Ό λ°›λŠ”λ°, μ΄λŠ” set의 μ‹œκ·Έλ„ μ§‘ν•©μ˜ λ°”μ΄νŠΈ λ‹¨μœ„ 크기λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. ν˜„μž¬λŠ” 이 μΈμžκ°€ sizeof(sigset_t) 값을 κ°€μ Έμ•Ό ν•œλ‹€. (μ•ˆ 그러면 EINVAL 였λ₯˜κ°€ λ‚œλ‹€.) glibc의 sigtimedwait() 래퍼 ν•¨μˆ˜μ—μ„œ 이런 μ„ΈλΆ€ 사항을 감좔고 컀널이 μ œκ³΅ν•  λ•Œ 투λͺ…ν•˜κ²Œ rt_sigtimedwait()을 ν˜ΈμΆœν•œλ‹€.

SEE ALSO

kill(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(3), sigsetops(3), sigwait(3), signal(7), time(7)


2017-09-15

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