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