wait(2) - wariua/manpages-ko GitHub Wiki
wait, waitpid, waitid - νλ‘μΈμ€ μν λ³κ²½ κΈ°λ€λ¦¬κΈ°
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
pid_t waitpid(pid_t pid, int *wstatus, int options);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
/* glibc λ° POSIXμ μΈν°νμ΄μ€. κΈ°λ° μμ€ν
νΈμΆμ λν μ 보λ NOTES μ°Έκ³ . */
glibc κΈ°λ₯ νμΈ λ§€ν¬λ‘ μ건 (feature_test_macros(7) μ°Έκ³ ):
-
waitid()
: -
- glibc 2.26λΆν°:
-
_XOPEN_SOURCE >= 500 ||
_POSIX_C_SOURCE >= 200809L
- glibc 2.25 λ° μ΄μ :
-
_XOPEN_SOURCE
|| /* glibc 2.12λΆν°: */ _POSIX_C_SOURCE >= 200809L
|| /* glibc λ²μ <= 2.19: */ _BSD_SOURCE
μ΄ μμ€ν νΈμΆλ€μ λͺ¨λ νΈμΆ νλ‘μΈμ€μ μμμμμ μν λ³κ²½μ κΈ°λ€λ¦¬κ³ μνκ° λ°λ μμμ λν μ 보λ₯Ό μ»λ λ° μ¬μ©νλ κ²μ΄λ€. μμμ΄ μ’ λ£νλ κ², μμμ΄ μκ·Έλμ μν΄ μ€μ§λλ κ², μμμ΄ μκ·Έλμ μν΄ μ¬κ°λλ κ²μ μν λ³κ²½μΌλ‘ λ³Έλ€. μμμ΄ μ’ λ£νλ κ²½μ°μ waitμ μννλ©΄ μμ€ν μ΄ μμκ³Ό μ°κ΄λ μμλ€μ ν΄μ ν μ μκ² λλ€. waitμ μννμ§ μμΌλ©΄ μ’ λ£ν μμμ΄ "μ’λΉ" μνλ‘ λ¨λλ€. (μλ NOTES μ°Έκ³ .)
μμμ΄ μ΄λ―Έ μνλ₯Ό λ°κΎΈμμΌλ©΄ μ΄ νΈμΆλ€μ΄ μ¦μ λ°ννλ€. κ·Έλ μ§ μμΌλ©΄ μμμ΄ μνλ₯Ό λ°κΎΈκ±°λ μκ·Έλ νΈλ€λ¬κ° νΈμΆμ μ€λ¨μν¬ λκΉμ§ (sigaction(2)μ SA_RESTART
νλκ·Έλ‘ μμ€ν
νΈμΆμ μλ μ¬μμνμ§ μλλ€κ³ κ°μ ) λΈλ‘ νλ€. μ΄ νμ΄μ§ λλ¨Έμ§μμλ μνκ° λ°λμμ§λ§ μμ§ μ΄ μμ€ν
νΈμΆλ€ μ€ νλλ‘ κΈ°λ€λ¦¬μ§ μμ μμμ κΈ°λ€λ¦΄ μ μλ€(waitable)κ³ νννλ€.
wait()
μμ€ν
νΈμΆμ μμλ€ μ€ νλκ° μ’
λ£ν λκΉμ§ νΈμΆ μ€λ λμ μ€νμ μ€μ§νλ€. wait(&wstatus)
νΈμΆμ λ€μκ³Ό λλ±νλ€.
waitpid(-1, &wstatus, 0);
waitpid()
μμ€ν
νΈμΆμ pid
μΈμλ‘ μ§μ ν μμμ΄ μνλ₯Ό λ°κΏ λκΉμ§ νΈμΆ μ€λ λμ μ€νμ μ€μ§νλ€. κΈ°λ³Έμ μΌλ‘ waitpid()
λ μμ μ’
λ£λ§ κΈ°λ€λ¦¬μ§λ§ μλμμ μ€λͺ
νλ― options
μΈμλ₯Ό ν΅ν΄ λμ λ°©μμ λ³κ²½ν μ μλ€.
pid
μ κ°μ λ€μμΌ μ μλ€.
< -1
- νλ‘μΈμ€ κ·Έλ£Ή IDκ°
pid
μ μ λκ°κ³Ό κ°μ μ무 μμ νλ‘μΈμ€λ κΈ°λ€λ¦¬κΈ° -1
- μ무 μμ νλ‘μΈμ€λ κΈ°λ€λ¦¬κΈ°
0
- νλ‘μΈμ€ κ·Έλ£Ή IDκ° νΈμΆ νλ‘μΈμ€μ νλ‘μΈμ€ κ·Έλ£Ή IDμ κ°μ μ무 μμ νλ‘μΈμ€λ κΈ°λ€λ¦¬κΈ°
> 0
- νλ‘μΈμ€ IDκ°
pid
κ°κ³Ό κ°μ μμ κΈ°λ€λ¦¬κΈ°
options
μ κ°μ λ€μ μμλ€μ 0κ° λλ κ·Έ μ΄μ OR ν κ²μ΄λ€.
WNOHANG
- μ’ λ£ν μμμ΄ μμΌλ©΄ μ¦μ λ°ννλ€.
WUNTRACED
- μμμ΄ μ μ§ν (νμ§λ§ ptrace(2) μΆμ λμμ μλ) κ²½μ°μλ λ°ννλ€. μ μ§νμΌλ©΄μ μΆμ λμμΈ μμμ μνλ μ΄ μ΅μ μ μ§μ νμ§ μμλ μ 곡λλ€.
-
WCONTINUED
(리λ μ€ 2.6.10λΆν°) - μ μ§νλ μμμ΄
SIGCONT
μ λ¬λ‘ μ¬κ°λ κ²½μ°μλ λ°ννλ€.
(리λ μ€ μ μ© μ΅μ λ€μ λν΄μ μλ μ°Έκ³ .)
wstatus
κ° NULLμ΄ μλλ©΄ wait()
κ³Ό waitpid()
κ° κ·Έ int
μ μν μ 보λ₯Ό μ μ₯ν΄ μ€λ€. λ€μ λ§€ν¬λ‘λ€λ‘ κ·Έ μ μλ₯Ό μ‘°μ¬ν μ μλ€. (wait()
κ³Ό waitpid()
μμμ²λΌ μ μ ν¬μΈν°λ₯Ό λ°λ κ² μλλΌ μ μ μ체λ₯Ό μΈμλ‘ λ°λλ€!)
WIFEXITED(wstatus)
-
μμμ΄ μ μμ μΌλ‘, μ¦ exit(3)λ _exit(2)λ₯Ό νΈμΆνκ±°λ
main()
μμ λ°ννμ¬ μ’ λ£νμΌλ©΄ μ°Έμ λ°ννλ€. WEXITSTATUS(wstatus)
-
μμμ μ’
λ£ μνλ₯Ό λ°ννλ€. μ΄ κ°μ μμμ΄ exit(3)λ _exit(2) νΈμΆμ μ§μ ν
status
μΈμλmain()
μ return λ¬Έμ μ§μ ν μΈμμ νμ 8λΉνΈμ΄λ€. μ΄ λ§€ν¬λ‘λWIFEXITED
κ° μ°Έμ λ°ννμ λλ§ μ¨μΌ νλ€. WIFSIGNALED(wstatus)
- μμ νλ‘μΈμ€κ° μκ·Έλλ‘ μ’ λ£λμμΌλ©΄ μ°Έμ λ°ννλ€.
WTERMSIG(wstatus)
-
μμ νλ‘μΈμ€λ₯Ό μ’
λ£μν¨ μκ·Έλμ λ²νΈλ₯Ό λ°ννλ€. μ΄ λ§€ν¬λ‘λ
WIFSIGNALED
κ° μ°Έμ λ°ννμ λλ§ μ¨μΌ νλ€. WCOREDUMP(wstatus)
-
μμμ΄ μ½μ΄ λ€νλ₯Ό λ§λ€μμΌλ©΄ μ°Έμ λ°ννλ€. (core(5) μ°Έκ³ .) μ΄ λ§€ν¬λ‘λ
WIFSIGNALED
κ° μ°Έμ λ°ννμ λλ§ μ¨μΌ νλ€.μ΄ λ§€ν¬λ‘λ POSIX.1-2001μ λͺ μΈλμ΄ μμ§ μμΌλ©° μ΄λ€ μ λμ€ κ΅¬ν(κ°λ Ή AIX, SunOS)μμλ μ¬μ© κ°λ₯νμ§ μλ€. κ·Έλ¬λ
#ifdef WCOREDUMP ... #endif
λ‘ κ°μΈμ μ¬μ©νλΌ. WIFSTOPPED(wstatus)
-
μμ νλ‘μΈμ€κ° μκ·Έλ μ λ¬λ‘ μΈν΄ μ μ§λμμΌλ©΄ μ°Έμ λ°ννλ€.
WUNTRACED
λ₯Ό μ¨μ νΈμΆνκ±°λ μμμ μΆμ μ€μΈ κ²½μ°(ptrace(2) μ°Έκ³ )μλ§ κ°λ₯νλ€. WSTOPSIG(wstatus)
-
μμμ΄ μ μ§νκ² λ§λ μκ·Έλμ λ²νΈλ₯Ό λ°ννλ€. μ΄ λ§€ν¬λ‘λ
WIFSTOPPED
κ° μ°Έμ λ°ννμ λλ§ μ¨μΌ νλ€. WIFCONTINUED(wstatus)
-
(리λ
μ€ 2.6.10λΆν°) μμ νλ‘μΈμ€κ°
SIGCONT
μ λ¬λ‘ μΈν΄ μ¬κ°λμμΌλ©΄ μ°Έμ λ°ννλ€.
(리λ
μ€ 2.6.9λΆν° μ¬μ© κ°λ₯ν) waitid()
μμ€ν
νΈμΆμμλ μ΄λ€ μμ μν λ³κ²½μ κΈ°λ€λ¦΄μ§μ λν΄ λ μ λ°ν μ μ΄κ° κ°λ₯νλ€.
idtype
λ° id
μΈμλ‘ λ€μκ³Ό κ°μ΄ κΈ°λ€λ¦΄ μμ(λ€)μ μ ννλ€.
idtype == P_PID
- νλ‘μΈμ€ IDκ°
id
μ μΌμΉνλ μμ κΈ°λ€λ¦¬κΈ°. idtype == P_PGID
- νλ‘μΈμ€ κ·Έλ£Ή IDκ°
id
μ μΌμΉνλ μ무 μμμ΄λ κΈ°λ€λ¦¬κΈ°. idtype == P_ALL
- μ무 μμμ΄λ κΈ°λ€λ¦¬κΈ°.
id
λ 무μ.
options
μμ λ€μ νλκ·Έλ€μ νλ μ΄μ OR νμ¬ κΈ°λ€λ¦΄ μμ μν λ³κ²½ μ’
λ₯λ₯Ό μ§μ νλ€.
WEXITED
- μ’ λ£ν μμμ κΈ°λ€λ¦°λ€.
WSTOPPED
- μκ·Έλ μ λ¬λ‘ μ μ§λ μμμ κΈ°λ€λ¦°λ€.
WCONTINUED
- (μμ μ μ§λμλ€κ°)
SIGCONT
μ λ¬λ‘ μ¬κ°λ μμμ κΈ°λ€λ¦°λ€.
options
μμ μΆκ°λ‘ λ€μ νλκ·Έλ€μ OR ν μ μλ€.
WNOHANG
-
waitpid()
μμμ κ°μ. WNOWAIT
- μμμ κΈ°λ€λ¦΄ μ μλ μνλ‘ λ¨κ²¨λλ€. μ΄νμ
wait
νΈμΆμ λ€μ μ¬μ©ν΄ μμ μν μ 보λ₯Ό μ»μ΄μ¬ μ μλ€.
μ±κ³΅ λ°ν μ waitid()
λ infop
κ° κ°λ¦¬ν€λ siginfo_t
ꡬ쑰체μ λ€μ νλλ€μ μ±μ΄λ€.
si_pid
- μμμ νλ‘μΈμ€ ID.
si_uid
- μμμ μ€μ μ¬μ©μ ID. (λ€λ₯Έ ꡬνλ€μμλ λλΆλΆ μ΄ νλλ₯Ό μ€μ νμ§ μλλ€.)
si_signo
- νμ
SIGCHLD
λ‘ μ€μ . si_status
- μμμ΄ _exit(2)μ (λλ exit(3)μ) μ€ μ’
λ£ μν, λλ μμμ μ’
λ£μν€κ±°λ μ μ§νκ±°λ μ¬κ°ν μκ·Έλ. μ΄ νλλ₯Ό μ΄λ»κ² ν΄μν΄μΌ νλμ§λ₯Ό
si_code
νλλ‘ νλ¨ν μ μλ€. si_code
- λ€μ μ€ νλλ‘ μ€μ :
CLD_EXITED
(μμμ΄ _exit(2)λ₯Ό νΈμΆνμ),CLD_KILLED
(μμμ΄ μκ·Έλλ‘ μ£½μμ),CLD_DUMPED
(μμμ΄ μκ·Έλλ‘ μ£½μκ³ μ½μ΄λ₯Ό λ€ν νμ),CLD_STOPPED
(μμμ΄ μκ·Έλλ‘ μ€μ§λμ),CLD_TRAPPED
(μΆμ νλ μμμ΄ νΈλ©μ κ±Έλ Έμ),CLD_CONTINUED
(μμμ΄SIGCONT
λ‘ μ¬κ°λμ).
options
μ WNOHANG
μ μ§μ νκ³ κΈ°λ€λ¦΄ μ μλ μνμΈ μμμ΄ μμΌλ©΄ waitid()
κ° μ¦μ 0μ λ°ννλ©° infop
κ° κ°λ¦¬ν€λ siginfo_t
ꡬ쑰체μ μνλ ꡬνμ λ°λΌ λ€λ₯΄λ€. μ΄ κ²½μ°λ₯Ό μμμ΄ κΈ°λ€λ¦΄ μ μλ μνμλ κ²½μ°μ (μ΄μμ± μλ λ°©μμΌλ‘) ꡬλ³νλ €λ©΄ νΈμΆ μ μ si_pid
νλλ₯Ό 0μΌλ‘ λ§λ€κ³ μ νΈμΆ λ°ν νμ μ΄ νλμ 0 μλ κ°μ΄ μλμ§ νμΈνλ©΄ λλ€.
POSIX.1-2008 κΈ°μ μ μ€ν 1(2013λ
)μμλ options
μ WNOHANG
μ μ§μ νκ³ κΈ°λ€λ¦΄ μ μλ μνμΈ μμμ΄ μμΌλ©΄ waitid()
κ° κ·Έ ꡬ쑰체μ si_pid
λ° si_signo
νλλ₯Ό 0μΌλ‘ μ±μμΌ νλ€λ μꡬ μ¬νμ μΆκ°νλ€. μ΄ μꡬ μ¬νμ μ€μνλ 리λ
μ€ λ° μ¬ν ꡬνλ€μμλ waitid()
νΈμΆ μ μ si_pid
νλλ₯Ό 0μΌλ‘ λ§λ€ νμκ° μλ€. νμ§λ§ λͺ¨λ ꡬνλ€μ΄ μ΄ μ μμ POSIX.1 λͺ
μΈλ₯Ό λ°λ₯΄μ§λ μλλ€.
wait()
: μ±κ³΅ μ μ’
λ£ν μμμ νλ‘μΈμ€ IDλ₯Ό λ°ννλ€. μ€λ₯ μ -1μ λ°ννλ€.
waitpid()
: μ±κ³΅ μ μνκ° λ°λ μμμ νλ‘μΈμ€ IDλ₯Ό λ°ννλ€. WNOHANG
μ μ§μ νκ³ pid
λ‘ μ§μ ν μμμ΄ νλ μ΄μ μ‘΄μ¬νμ§λ§ κ·Έ μμ(λ€)μ΄ μμ§ μνλ₯Ό λ°κΎΈμ§ μμμΌλ©΄ 0μ λ°ννλ€. μ€λ₯ μ -1μ λ°ννλ€.
waitid()
: μ±κ³΅ μ, λλ WNOHANG
μ μ§μ νκ³ id
λ‘ μ§μ ν μ΄λ μμλ μμ§ μνλ₯Ό λ°κΎΈμ§ μμμΌλ©΄ 0μ λ°ννλ€. μ€λ₯ μ -1μ λ°ννλ€.
μ΄ νΈμΆλ€ κ°κ°μ μ€λ₯ μμ errno
λ₯Ό μ μ ν κ°μΌλ‘ μ€μ νλ€.
ECHILD
- (
wait()μμ
) νΈμΆ νλ‘μΈμ€μκ² μμ§ κΈ°λ€λ¦¬μ§ μμ μμμ΄ μλ€. ECHILD
- (
waitpid()
λwaitid()
μμ)pid
λ(waitpid()
)idtype
λ°id
λ‘(waitid()
) μ§μ ν νλ‘μΈμ€κ° μ‘΄μ¬νμ§ μκ±°λ νΈμΆ νλ‘μΈμ€μ μμμ΄ μλλ€. (SIGCHLD
μ λν λμμ΄SIG_IGN
μΌλ‘ μ€μ λΌ μμΌλ©΄ μκΈ° μμμ λν΄μλ μ΄λ κ² λ μ μλ€. μ€λ λμ λν 리λ μ€ μ°Έκ³ μ¬ν μ λ μ°Έκ³ .) EINTR
-
WNOHANG
μ μ€μ νμ§ μμμΌλ©° μ°¨λ¨ μ λ μκ·Έλμ΄λSIGCHLD
λ₯Ό μ‘μλ€. signal(7) μ°Έκ³ . EINVAL
-
options
μΈμκ° μ ν¨νμ§ μλ€.
SVr4, 4.3BSD, POSIX.1-2001.
μ’
λ£λμλλ° κΈ°λ€λ € μ£Όμ§ μμ μμμ "μ’λΉ"κ° λλ€. 컀λμμλ μ’λΉ νλ‘μΈμ€μ λν μ΅μνμ μ 보(PID, μ’
λ£ μν, μμ μ¬μ© μ 보)λ₯Ό μ μ§νμ¬ μ΄ν λΆλͺ¨κ° waitμ μνν΄μ μμμ λν μ 보λ₯Ό μ»μ μ μλλ‘ νλ€. waitμ ν΅ν΄ μμ€ν
μμ μ κ±°νμ§ μλ ν μ’λΉλ 컀λ νλ‘μΈμ€ ν
μ΄λΈμμ μ리λ₯Ό μ°¨μ§νκ³ μλλ€. κ·Έλ¦¬κ³ μ΄ ν
μ΄λΈμ΄ κ°λ μ°¨λ©΄ νλ‘μΈμ€λ₯Ό μλ‘ λ§λλ κ² λΆκ°λ₯ν΄μ§λ€. λΆλͺ¨ νλ‘μΈμ€κ° μ’
λ£λλ©΄ "μ’λΉ" μμλ€μ΄ (μλ€λ©΄) init(1)
μκ² (λλ prctl(2) PR_SET_CHILD_SUBREAPER
λμμ ν΅ν΄ μ§μ ν κ°μ₯ κ°κΉμ΄ "μλΈλ¦¬νΌ" νλ‘μΈμ€μκ²) μ
μλλ€. κ·Έλ¬λ©΄ init(1)
μ΄ μλμΌλ‘ waitμ μννμ¬ μ’λΉλ₯Ό μ κ±°νλ€.
POSIX.1-2001μμλ SIGCHLD
μ²λ¦¬ λ°©μμ SIG_IGN
λ‘ μ€μ νκ±°λ SIGCHLD
μ SA_NOCLDWAIT
νλκ·Έλ₯Ό μ€μ ν κ²½μ°μ (sigaction(2) μ°Έκ³ ) μ’
λ£ν μμμ΄ μ’λΉκ° λμ§ μμΌλ©° wait()
μ΄λ waitpid()
νΈμΆμ΄ λͺ¨λ μμμ΄ μ’
λ£ν λκΉμ§ λΈλ‘ λμλ€κ° errno
λ₯Ό ECHILD
λ‘ ν΄μ μ€ν¨νκ² λλ€κ³ λͺ
μΈνλ€. (μλ POSIX νμ€μμλ SIGCHLD
λ₯Ό SIG_IGN
μΌλ‘ μ€μ νμ λμ λμ λ°©μμ λͺ
μΈνμ§ μκ³ λ¨κ²¨λμλ€. μ°Έκ³ λ‘ SIGCHLD
μ κΈ°λ³Έ μ²λ¦¬ λ°©μμ΄ "무μ"μ΄μ§λ§ μ²λ¦¬ λ°©μμ λͺ
μμ μΌλ‘ SIG_IGN
μΌλ‘ μ€μ νλ©΄ μ’λΉ νλ‘μΈμ€ μμ μ²λ¦¬ λ°©μμ΄ λ¬λΌμ§λ κ²μ΄λ€.)
리λ
μ€ 2.6μ POSIX μꡬλ₯Ό μ€μνλ€. νμ§λ§ 리λ
μ€ 2.4(λ° μ΄μ )μμλ κ·Έλ μ§ μμμ SIGCHLD
κ° λ¬΄μλλ λμ wait()
μ΄λ waitpid()
νΈμΆμ νλ©΄ SIGCHLD
κ° λ¬΄μλκ³ μμ§ μμ κ²μ²λΌ λμνλ€. μ¦, λ€μ μμ μ’
λ£ λκΉμ§ νΈμΆμ΄ λΈλ‘ λμ΄ μλ€κ° κ·Έ μμμ νλ‘μΈμ€ IDμ μνλ₯Ό λ°ννλ€.
리λ μ€ μ»€λμμ 컀λ μ€μΌμ€ μ€λ λλ νλ‘μΈμ€μ λλ ·νκ² κ΅¬λ³λλ μμκ° μλλ€. μ€λ λλ κ·Έμ 리λ μ€ κ³ μ μ clone(2) μμ€ν νΈμΆλ‘ λ§λ€μ΄μ§ νλ‘μΈμ€μΌ λΏμ΄λ€. κ·Έλ¦¬κ³ μ΄μμ± μλ pthread_create(3) κ°μ λ€λ₯Έ 루ν΄λ€μ΄ clone(2)μΌλ‘ ꡬνλμ΄ μλ€. 리λ μ€ 2.4 μ μμ μ€λ λλ νλ‘μΈμ€μ νΉμν κ²½μ°μΌ λΏμ΄μκ³ , κ·Έλμ κ°μ μ€λ λ κ·Έλ£Ήμ μν λμλ ν μ€λ λκ° λ€λ₯Έ μ€λ λμ μμμ κΈ°λ€λ¦΄ μ μμλ€. νμ§λ§ POSIXμμ κ·Έ κΈ°λ₯μ κ·μ νλ©΄μ 리λ μ€ 2.4λΆν°λ μ€λ λκ° κ°μ μ€λ λ κ·Έλ£Ή λ΄μ λ€λ₯Έ μ€λ λμ μμμ κΈ°λ€λ¦΄ μ μμΌλ©°, λ κΈ°λ³Έμ μΌλ‘ κ·Έλ κ² νλ€.
λ€μ 리λ
μ€ μ μ© options
κ°λ€μ clone(2)μΌλ‘ λ§λ μμλ€μ μ°κΈ° μν κ²μ΄λ€. 리λ
μ€ 4.7λΆν° waitid()
μλ μΈ μ μλ€.
__WCLONE
- "ν΄λ‘ " μμλ§ κΈ°λ€λ¦°λ€. μμΌλ©΄ "λΉν΄λ‘ " μμλ§ κΈ°λ€λ¦°λ€. ("ν΄λ‘ " μμμ μ’
λ£ μ μκΈ° λΆλͺ¨μκ² μκ·Έλμ μ λ¬νμ§ μκ±°λ
SIGCHLD
μλ μκ·Έλμ μ λ¬νλ μμμ΄λ€.)__WALL
λ μ§μ ν κ²½μ° μ΄ μ΅μ μ 무μνλ€. -
__WALL
(리λ μ€ 2.4λΆν°) - μ’ λ₯("ν΄λ‘ ", "λΉν΄λ‘ ")μ μκ΄μμ΄ λͺ¨λ μμμ κΈ°λ€λ¦°λ€.
-
__WNOTHREAD
(리λ μ€ 2.4λΆν°) - κ°μ μ€λ λ κ·Έλ£Ήμ λ€λ₯Έ μ€λ λμ μμμ κΈ°λ€λ¦¬μ§ μλλ€. 리λ μ€ 2.4 μ μμλ μ΄κ² κΈ°λ³Έμ΄μλ€.
리λ
μ€ 4.7λΆν°λ μμμ ptrace νκ³ μμΌλ©΄ μλμΌλ‘ __WALL
νλκ·Έλ₯Ό ν¨μνλ€.
wait()
μ΄ μ€μ λ‘λ (glibcμμ) wait4(2) νΈμΆλ‘ ꡬνλ λΌμ΄λΈλ¬λ¦¬ ν¨μμ΄λ€.
μ΄λ€ μν€ν
μ²μλ waitpid()
μμ€ν
νΈμΆμ΄ μλ€. λμ wait4(2)λ₯Ό νΈμΆνλ C λΌμ΄λΈλ¬λ¦¬ λνΌ ν¨μλ₯Ό ν΅ν΄ μ΄ μΈν°νμ΄μ€λ₯Ό ꡬννλ€.
μ§μ§ waitid()
μμ€ν
νΈμΆμ struct rusage *
νμ
μ λ€μ― λ²μ§Έ μΈμλ₯Ό λ°λλ€. μ΄ μΈμκ° NULLμ΄ μλλ©΄ wait4(2)μ κ°μ μμΌλ‘ μ΄λ₯Ό μ΄μ©ν΄ μμμ λν μμ μ¬μ© μ 보λ₯Ό λ°ννλ€. μμΈν λ΄μ©μ getrusage(2)λ₯Ό 보λΌ.
POSIX.1-2008μ λ°λ₯΄λ©΄ waitid()
λ₯Ό νΈμΆνλ μμ©μμ infop
κ° siginfo_t
ꡬ쑰체λ₯Ό κ°λ¦¬ν€λλ‘ (μ¦ λ ν¬μΈν°κ° μλλλ‘) 보μ₯ν΄μΌ νλ€. 리λ
μ€μμλ infop
κ° NULLμ΄μ΄λ waitid()
κ° μ±κ³΅νμ¬ κΈ°λ€λ¦° μμμ νλ‘μΈμ€ IDλ₯Ό λ°ννλ€. μμ©μμλ μΌκ΄μ± μκ³ λΉνμ€μ΄λ©° λΆνμν μ΄ λμ λ°©μμ μμ§νλ κ²μ νΌν΄μΌ νλ€.
λ€μ νλ‘κ·Έλ¨μ fork(2)μ waitpid()
μ¬μ© λ°©μμ λ³΄μ¬ μ€λ€. νλ‘κ·Έλ¨μμ μμ νλ‘μΈμ€λ₯Ό λ§λ λ€. νλ‘κ·Έλ¨μ λͺ
λ Ήν μΈμλ₯Ό μ£Όμ§ μμΌλ©΄ μμμ΄ pause(2)λ₯Ό μ΄μ©ν΄ μ€νμ λ©μΆλλ°, κ·Έλ μ¬μ©μκ° μμμκ² μκ·Έλμ λ³΄λΌ μ μλ€. λͺ
λ Ήν μΈμκ° μμΌλ©΄ λͺ
λ Ήνμμ μ€ μ μλ₯Ό μ’
λ£ μνλ‘ μ¬μ©ν΄μ μμμ΄ μ¦μ μ’
λ£νλ€. λΆλͺ¨ νλ‘μΈμ€λ 루νλ₯Ό λλ©΄μ waitpid()
λ‘ μμμ κ°μνλ©°, μμμ μ€λͺ
ν W*()
λ§€ν¬λ‘λ€μ μ΄μ©ν΄ μ’
λ£ μν κ°μ λΆμνλ€.
λ€μ μ Έ μΈμ μ΄ νλ‘κ·Έλ¨ μ¬μ© λ°©μμ λ³΄μ¬ μ€λ€.
$ ./a.out &
Child PID is 32360
[1] 32359
$ kill -STOP 32360
stopped by signal 19
$ kill -CONT 32360
continued
$ kill -TERM 32360
killed by signal 15
[1]+ Done ./a.out
$
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
pid_t cpid, w;
int wstatus;
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* μμμ΄ μ€ννλ μ½λ */
printf("Child PID is %ld\n", (long) getpid());
if (argc == 1)
pause(); /* μκ·Έλ κΈ°λ€λ¦¬κΈ° */
_exit(atoi(argv[1]));
} else { /* λΆλͺ¨κ° μ€ννλ μ½λ */
do {
w = waitpid(cpid, &wstatus, WUNTRACED | WCONTINUED);
if (w == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(wstatus)) {
printf("exited, status=%d\n", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
printf("killed by signal %d\n", WTERMSIG(wstatus));
} else if (WIFSTOPPED(wstatus)) {
printf("stopped by signal %d\n", WSTOPSIG(wstatus));
} else if (WIFCONTINUED(wstatus)) {
printf("continued\n");
}
} while (!WIFEXITED(wstatus) && !WIFSIGNALED(wstatus));
exit(EXIT_SUCCESS);
}
}
_exit(2), clone(2), fork(2), ptrace(2), sigaction(2), signal(2), wait4(2), pthread_create(3), credentials(7), signal(7)
2018-04-30