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

NAME

sigprocmask, rt_sigprocmask - 블둝 된 μ‹œκ·Έλ„ μ‘°μ‚¬ν•˜κ³  λ°”κΎΈκΈ°

SYNOPSIS

#include <signal.h>

/* glibc 래퍼 ν•¨μˆ˜ μ›ν˜• */
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

/* 기반 μ‹œμŠ€ν…œ 호좜 μ›ν˜• */
int rt_sigprocmask(int how, const kernel_sigset_t *set,
                   kernel_sigset_t *oldset, size_t sigsetsize);

/* ꡬ식 μ‹œμŠ€ν…œ 호좜 μ›ν˜• (제거 μ˜ˆμ •) */
int sigprocmask(int how, const old_kernel_sigset_t *set,
                old_kernel_sigset_t *oldset);

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

sigprocmask():
_POSIX_C_SOURCE

DESCRIPTION

sigprocmask()λ₯Ό μ‚¬μš©ν•΄ 호좜 μŠ€λ ˆλ“œμ˜ μ‹œκ·Έλ„ 마슀크λ₯Ό κ°€μ Έμ˜€κ³  λ°”κΎΌλ‹€. μ‹œκ·Έλ„ λ§ˆμŠ€ν¬λŠ” ν˜„μž¬ ν˜ΈμΆœμžμ—κ²Œ 전달이 μ°¨λ‹¨λœ μ‹œκ·Έλ„λ“€μ˜ 집합이닀. (더 μžμ„Έν•œ λ‚΄μš©μ€ signal(7)도 μ°Έκ³ .)

λ‹€μŒκ³Ό 같이 how 값에 따라 호좜의 λ™μž‘ 방식이 달라진닀.

SIG_BLOCK
ν˜„μž¬ μ§‘ν•©κ³Ό set 인자의 ꡐ집합이 차단 μ‹œκ·Έλ„ 집합이 λœλ‹€.
SIG_UNBLOCK
ν˜„μž¬ 차단 μ‹œκ·Έλ„ μ§‘ν•©μ—μ„œ set의 μ‹œκ·Έλ„λ“€μ„ μ œκ±°ν•œλ‹€. λ§‰ν˜€ μžˆμ§€ μ•Šμ€ μ‹œκ·Έλ„μ„ μ œκ±°ν•˜λ €λŠ” 것도 ν—ˆμš©ν•œλ‹€.
SIG_SETMASK
차단 μ‹œκ·Έλ„ 집합을 set 인자둜 μ„€μ •ν•œλ‹€.

oldset이 NULL이 μ•„λ‹ˆλ©΄ 이전 μ‹œκ·Έλ„ 마슀크 값을 oldset에 μ €μž₯ν•œλ‹€.

set이 NULL이면 μ‹œκ·Έλ„ λ§ˆμŠ€ν¬κ°€ λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€. (즉, howλ₯Ό λ¬΄μ‹œν•œλ‹€.) κ·Έλ ‡λ‹€κ³  해도 ν˜„μž¬ μ‹œκ·Έλ„ 마슀크 값을 oldset으둜 (NULL이 μ•„λ‹ˆλΌλ©΄) λ°˜ν™˜ν•œλ‹€.

sigset_t("μ‹œκ·Έλ„ μ§‘ν•©") νƒ€μž… λ³€μˆ˜λ₯Ό λ³€κ²½ν•˜κ³  κ²€μ‚¬ν•˜λŠ” ν•¨μˆ˜λ“€μ„ sigsetops(3)μ—μ„œ μ„€λͺ…ν•œλ‹€.

닀쀑 μŠ€λ ˆλ“œ ν”„λ‘œμ„ΈμŠ€μ—μ„œμ˜ sigprocmask() μ‚¬μš©μ€ λͺ…μ„Έλ˜μ–΄ μžˆμ§€ μ•Šλ‹€. pthread_sigmask(3)λ₯Ό 보라.

RETURN VALUE

sigprocmask()λŠ” 성곡 μ‹œ 0을 λ°˜ν™˜ν•˜κ³  였λ₯˜ μ‹œ -1을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ λ•ŒλŠ” 원인을 λ‚˜νƒ€λ‚΄λ„λ‘ errnoλ₯Ό μ„€μ •ν•œλ‹€.

ERRORS

EFAULT
setμ΄λ‚˜ oldset μΈμžκ°€ ν”„λ‘œμ„ΈμŠ€μ—κ²Œ ν• λ‹Ήλœ μ£Όμ†Œ 곡간 밖을 가리킀고 μžˆλ‹€.
EINVAL
how둜 μ§€μ •ν•œ 값이 μœ νš¨ν•˜μ§€ μ•Šκ±°λ‚˜ sigsetsize둜 μ „λ‹¬ν•œ 크기λ₯Ό 컀널이 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

CONFORMING TO

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

NOTES

SIGKILLμ΄λ‚˜ SIGSTOP을 λ§‰λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€. κ·Έλ ‡κ²Œ ν•˜λ €λŠ” μ‹œλ„λŠ” 쑰용히 λ¬΄μ‹œλœλ‹€.

ν”„λ‘œμ„ΈμŠ€μ˜ 각 μŠ€λ ˆλ“œκ°€ 각자의 μ‹œκ·Έλ„ 마슀크λ₯Ό κ°€μ§€κ³  μžˆλ‹€.

fork(2)λ₯Ό 톡해 μƒμ„±λœ μžμ‹μ€ λΆ€λͺ¨μ˜ μ‹œκ·Έλ„ 마슀크 사본을 λ¬Όλ €λ°›λŠ”λ‹€. execve(2)λ₯Ό κ±°μΉ˜λ©΄μ„œ μ‹œκ·Έλ„ λ§ˆμŠ€ν¬κ°€ λ³΄μ‘΄λœλ‹€.

SIGBUG, SIGFPE, SIGILL, SIGSEGVκ°€ 블둝 된 μƒνƒœμ—μ„œ μƒμ„±λ˜λŠ” 경우 kill(2)μ΄λ‚˜ sigqueue(3), raise(3)둜 μ‹œκ·Έλ„μ΄ μƒμ„±λœ 게 μ•„λ‹ˆλ©΄ κ²°κ³Όκ°€ κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

μ‹œκ·Έλ„ μ§‘ν•© μ‘°μž‘μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ sigsetops(3)λ₯Ό 보라.

참고둜 setκ³Ό oldset을 λͺ¨λ‘ NULL둜 μ§€μ •ν•˜λŠ” 것도 (μ•„μ£Ό μœ μš©ν•˜μ§€λŠ” μ•Šμ§€λ§Œ) ν—ˆμš©λœλ‹€.

C 라이브러리/컀널 차이

μ»€λ„μ˜ sigset_t μ •μ˜λŠ” C λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ“°λŠ” 것과 크기가 λ‹€λ₯΄λ‹€. 이 맀뉴얼 νŽ˜μ΄μ§€μ—μ„œλŠ” μ „μžλ₯Ό kernel_sigset_t라고 λΆ€λ₯Έλ‹€. (κ·Έλ ‡μ§€λ§Œ 컀널 μ†ŒμŠ€μ—μ„œμ˜ 이름은 sigset_t이닀.)

glibc의 sigprocmask() 래퍼 ν•¨μˆ˜μ—μ„œλŠ” NPTL μŠ€λ ˆλ”© κ΅¬ν˜„ λ‚΄λΆ€μ—μ„œ μ“°λŠ” 두 κ°€μ§€ μ‹€μ‹œκ°„ μ‹œκ·Έλ„μ„ λ§‰μœΌλ €λŠ” μ‹œλ„λ₯Ό 쑰용히 λ¬΄μ‹œν•œλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ nptl(7)을 보라.

μ›λž˜ λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œ 호좜의 이름은 sigprocmask()μ˜€λ‹€. ν•˜μ§€λ§Œ λ¦¬λˆ…μŠ€ 2.2에 μ‹€μ‹œκ°„ μ‹œκ·Έλ„μ΄ μΆ”κ°€λ˜λ©΄μ„œ κ·Έ μ‹œμŠ€ν…œ 호좜이 μ§€μ›ν•˜λ˜ κ³ μ • 크기 32λΉ„νŠΈ sigset_t νƒ€μž…(이 맀뉴얼 νŽ˜μ΄μ§€μ—μ„œ old_kernel_sigset_t)이 λ”λŠ” μš©λ„μ— λ§žμ§€ μ•Šκ²Œ λ˜μ—ˆλ‹€. 그에 따라 ν™•μž₯된 sigset_t νƒ€μž…(이 맀뉴얼 νŽ˜μ΄μ§€μ—μ„œ kernel_sigset_t)을 μ§€μ›ν•˜κΈ° μœ„ν•΄ μƒˆλ‘œμš΄ μ‹œμŠ€ν…œ 호좜 rt_sigprocmask()κ°€ μΆ”κ°€λ˜μ—ˆλ‹€. μƒˆ μ‹œμŠ€ν…œ ν˜ΈμΆœμ—μ„œ λ„€ 번째 인자둜 size_t sigsetsizeλ₯Ό λ°›λŠ”λ°, μ΄λŠ” setκ³Ό oldset의 μ‹œκ·Έλ„ μ§‘ν•©μ˜ λ°”μ΄νŠΈ λ‹¨μœ„ 크기λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. ν˜„μž¬λŠ” 이 μΈμžκ°€ κ³ μ •λœ μ•„ν‚€ν…μ²˜λ³„ κ°’(sizeof(kernel_sigset_t))을 κ°€μ Έμ•Ό ν•œλ‹€.

glibc의 sigprocmask() 래퍼 ν•¨μˆ˜μ—μ„œ 이런 μ„ΈλΆ€ 사항을 감좔고 컀널이 μ œκ³΅ν•  λ•Œ 투λͺ…ν•˜κ²Œ rt_sigprocmask()λ₯Ό ν˜ΈμΆœν•œλ‹€.

SEE ALSO

kill(2), pause(2), sigaction(2), signal(2), sigpending(2), sigsuspend(2), pthread_sigmask(3), sigqueue(3), sigsetops(3), signal(7)


2017-09-15

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