signal safety(7) - wariua/manpages-ko GitHub Wiki

NAME

signal-safety - 비동기 μ‹œκ·Έλ„ μ•ˆμ „ ν•¨μˆ˜λ“€

DESCRIPTION

비동기 μ‹œκ·Έλ„ μ•ˆμ „(async-signal-safe) ν•¨μˆ˜λŠ” μ‹œκ·Έλ„ ν•Έλ“€λŸ¬ μ•ˆμ—μ„œ μ•ˆμ „ν•˜κ²Œ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜μ΄λ‹€. λ§Žμ€ ν•¨μˆ˜λ“€μ€ 비동기 μ‹œκ·Έλ„ μ•ˆμ „ ν•¨μˆ˜κ°€ μ•„λ‹ˆλ‹€. 특히 μž¬μ§„μž… κ°€λŠ₯ν•˜μ§€ μ•Šμ€ ν•¨μˆ˜λ“€μ€ 일반적으둜 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬ μ•ˆμ—μ„œ ν˜ΈμΆœν•˜λŠ” 게 μ•ˆμ „ν•˜μ§€ μ•Šλ‹€.

λͺ¨λ“  ν•¨μˆ˜λ“€μ΄ 비동기 μ‹œκ·Έλ„μ— μ•ˆμ „ν•˜μ§€ μ•Šμ€ stdio 라이브러리 κ΅¬ν˜„μ„ 생각해 보면 ν•¨μˆ˜λ₯Ό μ•ˆμ „ν•˜μ§€ μ•Šκ²Œ λ§Œλ“œλŠ” μ’…λ₯˜μ˜ λ¬Έμ œλ“€μ„ 금방 이해할 수 μžˆλ‹€.

νŒŒμΌμ— λŒ€ν•΄ 버퍼링 I/Oλ₯Ό μˆ˜ν–‰ν•  λ•Œ stdio ν•¨μˆ˜λ“€μ—μ„œλŠ” 정적 ν• λ‹Ή 데이터 버퍼와 ν•¨κ»˜ 버퍼 λ‚΄ 데이터 μ–‘κ³Ό ν˜„μž¬ μœ„μΉ˜λ₯Ό κΈ°λ‘ν•˜λŠ” 연계 μΉ΄μš΄ν„° 및 인덱슀λ₯Ό (λ˜λŠ” 포인터듀을) μœ μ§€ν•΄μ•Ό ν•œλ‹€. μ£Ό ν”„λ‘œκ·Έλž¨μ΄ printf(3) 같은 stdio ν•¨μˆ˜ 호좜 쀑에 있고 κ·Έ μ•ˆμ—μ„œ 버퍼와 μ—°κ΄€ λ³€μˆ˜λ“€μ„ λΆ€λΆ„μ μœΌλ‘œ κ°±μ‹ ν–ˆλ‹€κ³  ν•˜μž. λ§Œμ•½ κ·Έ μˆœκ°„μ— μ‹œκ·Έλ„ ν•Έλ“€λŸ¬κ°€ ν”„λ‘œκ·Έλž¨μ„ μ€‘λ‹¨μ‹œν‚€κ³  ν•Έλ“€λŸ¬μ—μ„œ λ‹€μ‹œ printf(3)λ₯Ό ν˜ΈμΆœν•˜λ©΄ κ·Έ 두 번째 printf(3) ν˜ΈμΆœμ€ 일관적이지 μ•Šμ€ λ°μ΄ν„°λ‘œ λ™μž‘ν•˜κ²Œ 되며 κ²°κ³Όκ°€ 예츑 λΆˆκ°€λŠ₯ν•˜λ‹€.

μ•ˆμ „ν•˜μ§€ μ•Šμ€ ν•¨μˆ˜μ˜ 문제λ₯Ό ν”Όν•˜λ €λ©΄ 두 κ°€μ§€ 선택지가 μžˆλ‹€.

  1. (a) μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ—μ„œ 비동기 μ‹œκ·Έλ„ μ•ˆμ „ ν•¨μˆ˜λ§Œ ν˜ΈμΆœν•˜κ³  (b) μ‹œκ·Έλ„ ν•Έλ“€λŸ¬ μžμ²΄κ°€ μ£Ό ν”„λ‘œκ·Έλž¨μ˜ μ „μ—­ λ³€μˆ˜λ“€μ— λŒ€ν•΄ μž¬μ§„μž… κ°€λŠ₯이게 ν•œλ‹€.

  2. μ£Ό ν”„λ‘œκ·Έλž¨μ—μ„œ μ•ˆμ „ν•˜μ§€ μ•Šμ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ—μ„œλ„ μ ‘κ·Όν•˜λŠ” μ „μ—­ 데이터λ₯Ό λ‹€λ£° λ•Œ μ‹œκ·Έλ„ 전달을 λ§‰λŠ”λ‹€.

일반적으둜 두 번째 μ„ νƒμ§€λŠ” μ—¬ν•˜ν•œ λ³΅μž‘λ„μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œλ„ μ–΄λ ΅κΈ° λ•Œλ¬Έμ— 첫 번째 선택지λ₯Ό μ·¨ν•œλ‹€.

POSIX.1μ—μ„œλŠ” κ΅¬ν˜„μ—μ„œ 비동기 μ‹œκ·Έλ„ μ•ˆμ „μœΌλ‘œ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” ν•¨μˆ˜λ“€μ„ λͺ…μ„Έν•œλ‹€. (μ–΄λ–€ κ΅¬ν˜„μ—μ„œλŠ” 더 λ§Žμ€ ν•¨μˆ˜λ“€μ— μ•ˆμ „ν•œ κ΅¬ν˜„μ„ μ œκ³΅ν•  μˆ˜λ„ μžˆλ‹€. ν•˜μ§€λ§Œ ν‘œμ€€μ—μ„œ μš”κ΅¬ν•˜λŠ” 것이 μ•„λ‹ˆλ―€λ‘œ λ‹€λ₯Έ κ΅¬ν˜„μ—μ„œλŠ” 같은 보μž₯을 ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.) 일반적으둜 ν•¨μˆ˜κ°€ 비동기 μ‹œκ·Έλ„μ— μ•ˆμ „ν•œ 건 μž¬μ§„μž… κ°€λŠ₯ν•˜κ±°λ‚˜ μ‹œκ·Έλ„μ— λŒ€ν•΄ μ›μžμ (즉 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬λ‘œ 싀행을 μ€‘λ‹¨μ‹œν‚¬ 수 μ—†μŒ)μ΄μ–΄μ„œμ΄λ‹€.

POSIX.1μ—μ„œ 비동기 μ‹œκ·Έλ„ μ•ˆμ „μ΄κΈ°λ₯Ό μš”κ΅¬ν•˜λŠ” ν•¨μˆ˜λ“€μ΄ μ•„λž˜ ν‘œμ— μžˆλ‹€. 별닀λ₯Έ 언급이 μ—†λŠ” ν•¨μˆ˜λŠ” POSIX.1-2001μ—μ„œ 비동기 μ‹œκ·Έλ„ μ•ˆμ „μ„ μš”κ΅¬ν•œ 것이며, 후속 ν‘œμ€€μ—μ„œ 바뀐 λ‚΄μš©μ΄ μ ν˜€ μžˆλ‹€.

ν•¨μˆ˜ μ°Έκ³ 
abort(3) POSIX.1-2003μ—μ„œ μΆ”κ°€
accept(2)
access(2)
aio_error(3)
aio_return(3)
aio_suspend(3) μ•„λž˜ μ°Έκ³ 
alarm(2)
bind(2)
cfgetispeed(3)
cfgetospeed(3)
cfsetispeed(3)
cfsetospeed(3)
chdir(2)
chmod(2)
chown(2)
clock_gettime(2)
close(2)
connect(2)
creat(2)
dup(2)
dup2(2)
execl(3) POSIX.1-2008μ—μ„œ μΆ”κ°€. μ•„λž˜ μ°Έκ³ 
execle(3) μ•„λž˜ μ°Έκ³ 
execv(3) POSIX.1-2008μ—μ„œ μΆ”κ°€
execve(2)
_exit(2)
_Exit(2)
faccessat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
fchdir(2) POSIX.1-2013μ—μ„œ μΆ”κ°€
fchmod(2)
fchmodat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
fchown(2)
fchownat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
fcntl(2)
fdatasync(2)
fexecve(3) POSIX.1-2008μ—μ„œ μΆ”κ°€
ffs(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
fork(2) μ•„λž˜ μ°Έκ³ 
fstat(2)
fstatat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
fsync(2)
ftruncate(2)
futimens(3) POSIX.1-2008μ—μ„œ μΆ”κ°€
getegid(2)
geteuid(2)
getgid(2)
getgroups(2)
getpeername(2)
getpgrp(2)
getpid(2)
getppid(2)
getsockname(2)
getsockopt(2)
getuid(2)
htonl(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
htons(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
kill(2)
link(2)
linkat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
listen(2)
longjmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€, μ•„λž˜ μ°Έκ³ 
lseek(2)
lstat(2)
memccpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
memchr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
memcmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
memcpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
memmove(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
memset(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
mkdir(2)
mkdirat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
mkfifo(3)
mkfifoat(3) POSIX.1-2008μ—μ„œ μΆ”κ°€
mknod(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
mknodat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
ntohl(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
ntohs(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
open(2)
openat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
pause(2)
pipe(2)
poll(2)
posix_trace_event(3)
pselect(2)
pthread_kill(3) POSIX.1-2013μ—μ„œ μΆ”κ°€
pthread_self(3) POSIX.1-2013μ—μ„œ μΆ”κ°€
pthread_sigmask(3) POSIX.1-2013μ—μ„œ μΆ”κ°€
raise(3)
read(2)
readlink(2)
readlinkat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
recv(2)
recvfrom(2)
recvmsg(2)
rename(2)
renameat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
rmdir(2)
select(2)
sem_post(3)
send(2)
sendmsg(2)
sendto(2)
setgid(2)
setpgid(2)
setsid(2)
setsockopt(2)
setuid(2)
shutdown(2)
sigaction(2)
sigaddset(3)
sigdelset(3)
sigemptyset(3)
sigfillset(3)
sigismember(3)
siglongjmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€, μ•„λž˜ μ°Έκ³ 
signal(2)
sigpause(3)
sigpending(2)
sigprocmask(2)
sigqueue(2)
sigset(3)
sigsuspend(2)
sleep(3)
sockatmark(3) POSIX.1-2004μ—μ„œ μΆ”κ°€
socket(2)
socketpair(2)
stat(2)
stpcpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
stpncpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strcat(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strchr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strcmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strcpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strcspn(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strlen(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strncat(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strncmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strncpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strnlen(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strpbrk(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strrchr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strspn(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strstr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
strtok_r(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
symlink(2)
symlinkat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
tcdrain(3)
tcflow(3)
tcflush(3)
tcgetattr(3)
tcgetpgrp(3)
tcsendbreak(3)
tcsetattr(3)
tcsetpgrp(3)
time(2)
timer_getoverrun(2)
timer_gettime(2)
timer_settime(2)
times(2)
umask(2)
uname(2)
unlink(2)
unlinkat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
utime(2)
utimensat(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
utimes(2) POSIX.1-2008μ—μ„œ μΆ”κ°€
wait(2)
waitpid(2)
wcpcpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcpncpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcscat(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcscat(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcschr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcscmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcscpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcscspn(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcslen(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcsncat(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcsncmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcsncpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcsnlen(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcspbrk(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcsrchr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcsspn(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcsstr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wcstok(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wmemchr(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wmemcmp(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wmemcpy(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wmemmove(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
wmemset(3) POSIX.1-2016μ—μ„œ μΆ”κ°€
write(2)

μ°Έκ³ :

  • POSIX.1-2001κ³Ό POSIX.1-2004μ—μ„œλŠ” fpathconf(3), pathconf(3), sysconf(3)κ°€ 비동기 μ‹œκ·Έλ„ μ•ˆμ „μ΄κΈ°λ₯Ό μš”κ΅¬ν–ˆμ§€λ§Œ POSIX.1-2008μ—μ„œ 이 μš”κ΅¬κ°€ μ œκ±°λ˜μ—ˆλ‹€.

  • μ•ˆμ „ν•˜μ§€ μ•Šμ€ ν•¨μˆ˜μ˜ 싀행이 μ‹œκ·Έλ„ ν•Έλ“€λŸ¬λ‘œ μ€‘λ‹¨λ˜κ³ , κ·Έ ν•Έλ“€λŸ¬κ°€ longjmp(3)λ‚˜ siglongjmp(3) ν˜ΈμΆœμ„ 톡해 λλ‚˜κ³ , 이후 ν”„λ‘œκ·Έλž¨μ—μ„œ μ•ˆμ „ν•˜μ§€ μ•Šμ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°μ— ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘ 방식이 κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

  • POSIX.1-2003μ—μ„œλŠ” μ‘μš©μ΄ μ‹œκ·Έλ„ ν•Έλ“€λŸ¬μ—μ„œ fork(2)λ₯Ό ν˜ΈμΆœν•˜κ³  pthread_atfork(3) 호좜둜 λ“±λ‘ν•œ 포크 ν•Έλ“€λŸ¬μ—μ„œ 비동기 μ‹œκ·Έλ„μ— μ•ˆμ „ν•˜μ§€ μ•Šμ€ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 경우 λ™μž‘ 방식이 κ·œμ •λ˜μ–΄ μžˆμ§€ μ•ŠμŒμ„ λΆ„λͺ…νžˆ ν•˜μ˜€λ‹€. κ·Έ ν‘œμ€€μ˜ ν–₯ν›„ λ¦¬λΉ„μ „μ—μ„œ fork(2)λ₯Ό 비동기 μ‹œκ·Έλ„ μ•ˆμ „ ν•¨μˆ˜ λͺ©λ‘μ—μ„œ μ œκ±°ν•  κ°€λŠ₯성이 λ†’λ‹€.

GNU C 라이브러리의 μΌνƒˆ

GNU C λΌμ΄λΈŒλŸ¬λ¦¬μ— λ‹€μŒκ³Ό 같은 ν‘œμ€€ μΌνƒˆμ΄ μžˆλ‹€.

  • glibc 2.24 μ „μ—μ„œ execl(3)κ³Ό execle(3)이 λ‚΄λΆ€μ μœΌλ‘œ realloc(3)을 μ΄μš©ν–ˆκ³  그둜 인해 비동기 μ‹œκ·Έλ„ μ•ˆμ „μ΄ μ•„λ‹ˆμ—ˆλ‹€. glibc 2.24μ—μ„œ μˆ˜μ •λ˜μ—ˆλ‹€.

  • glibc의 aio_suspend(3) κ΅¬ν˜„μ΄ λ‚΄λΆ€μ μœΌλ‘œ pthread_mutex_lock(3)을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 비동기 μ‹œκ·Έλ„ μ•ˆμ „μ΄ μ•„λ‹ˆλ‹€.

SEE ALSO

sigaction(2), signal(7), standards(7)


2017-03-13

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