๐ง ํ๋ก์ธ์ค์ ์ ์ด
Unix๋ C ํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ ํ๋ก์ธ์ค๋ฅผ ์ ์ดํ๊ธฐ ์ํด ๋ง์ ์์คํ ์ฝ์ ์ ๊ณตํฉ๋๋ค.
๋ค์์ ๋ํ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๋๋ค.
ํ๋ก์ธ์ค ID ๊ฐ์ ธ์ค๊ธฐ
ํ๋ก์ธ์ค ์์ฑ๊ณผ ์ข ๋ฃ
์์ ํ๋ก์ธ์ค ์ ๊ฑฐ
ํ๋ก๊ทธ๋จ์ ๋ก๋ฉ๊ณผ ์คํ
๐ง ํ๋ก์ธ์ค ID ๊ฐ์ ธ์ค๊ธฐ
getpid : ํธ์ถํ๋ ํ๋ก์ธ์ค์ PID๋ฅผ ๋ฐํํฉ๋๋ค.
getppid : ๋ถ๋ชจ ํ๋ก์ธ์ค์ PID๋ฅผ ๋ฐํํฉ๋๋ค. (์ฆ ํธ์ถํ๋ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐํํฉ๋๋ค.)
๊ฐ๊ฐ์ ํ๋ก์ธ์ค๋ ๊ณ ์ ํ ํ๋ก์ธ์ค ID (PID)๋ฅผ ๊ฐ์ต๋๋ค.
์์ ํจ์๋ค์ ํตํด PID๋ฅผ ์ป์ด์ฌ ์ ์์ต๋๋ค.
์ด๋ ๋ฐํ ํ์ ์ pid_t ํ์ ์ ์ ์ ๊ฐ์ด๋ฉฐ, ์ด๋ ๋ฆฌ๋ ์ค ์์คํ ์์ types.h์ ์ ์๋ก ์ ์ฅ๋์ด ์์ต๋๋ค.
๐ง ํ๋ก์ธ์ค์ ์ํ
ํ๋ก๊ทธ๋๋จธ์ ๊ด์ ์์ ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ์ํ ์ค ํ๋์ ์ํ๋ฅผ ๊ฐ์ง๋ค ์๊ฐํ ์ ์์ต๋๋ค.
Running : ํ๋ก์ธ์ค๋ CPU์์ ์คํํ๊ณ ์๊ฑฐ๋, ์คํ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ผ๋ฉฐ, ์ต์ข ์ ์ผ๋ก๋ ์ปค๋์ ์ํด ์ค์ผ์ค๋ ๊ฒ์ ๋๋ค.
Stopped : ํ๋ก์ธ์ค์ ์คํ์ ์ ์งํ ์ํ์ด๋ฉฐ, ์ค์ผ์ค๋์ง ์์ต๋๋ค.
ํ๋ก์ธ์ค๋ SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU ์๊ทธ๋์ ๋ฐ๊ฒ ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ก ์ ์งํ๊ณ ,
SIGCONT ์๊ทธ๋์ ๋ฐ์ ๋๊น์ง ์ ์งํ์๋ค๊ฐ ํด๋น ์๊ทธ๋์ ๋ฐ์ ์์ ์์ ๋ค์ ์คํ์ ์์ํฉ๋๋ค.
(์๊ทธ๋์ ์ผ์ข ์ ์ํํธ์จ์ด ์ธํฐ๋ฝํธ์ ๋๋ค.)
Terminated : ํ๋ก์ธ์ค๋ ์๊ตฌ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค. ํ๋ก์ธ์ค๋ ๋ค์์ ์ธ ๊ฐ์ง ์ด์ ์ค์ ํ๋๋ก ์ข ๋ฃ๋ฉ๋๋ค.
1) ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ ์๊ทธ๋์ ๋ฐ์์ ๋.
2) ๋ฉ์ธ ๋ฃจํด์์ ๋ฆฌํดํ ๋
3) exit ํจ์๋ฅผ ํธ์ถํ ๋
๐ง ํ๋ก์ธ์ค์ ์์ฑ - fork
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
๋ถ๋ชจ ํ๋ก์ธ์ค๋ fork ํจ์๋ฅผ ๋ถ๋ฌ์ ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํฉ๋๋ค.
์๋กญ๊ฒ ์์ฑ๋ ์์ ํ๋ก์ธ์ค๋ ์๋ฒฝํ๊ฒ๋ ์๋์ง๋ง ๋ถ๋ชจ์ ๊ฑฐ์ ๋์ผํฉ๋๋ค.
์์์ ์ฝ๋, ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ, ํ, ๊ณต์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ฌ์ฉ์ ์คํ์ ํฌํจํ๋ ๋ถ๋ชจ์ ์ฌ์ฉ์์์ค ๊ฐ์ ์ฃผ์๊ณต๊ฐ๊ณผ ๋์ผํ(๊ทธ๋ฌ๋ ๋ถ๋ฆฌ๋) ๋ณต์ฌ๋ณธ์ ๊ฐ์ต๋๋ค.
์์์ ๋ํ ๋ถ๋ชจ๊ฐ ์คํํ ํ์ผ ์๋ณ์ ๋ชจ๋์ ๋์ผํ ์ฌ๋ณธ์ ๊ฐ์ต๋๋ค.
์ด๊ฒ์ ๋ถ๋ชจ๊ฐ fork๋ฅผ ํธ์ถํ์ ๋ ๋ถ๋ชจ๊ฐ ์คํํ ํ์ผ ๋ชจ๋๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ถ๋ชจ์ ์์ฑ๋ ์์ ๊ฐ์ ๊ฐ์ฅ ์ค์ํ ์ฐจ์ด๋ ์ด๋ค์ด ์๋ก ๋ค๋ฅธ PID๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ ๋๋ค.
๋ํ fork ํจ์๋ ํน์ดํ ํน์ง์ ๊ฐ์ง๋๋ค.
fork ํจ์๋ ๋ ๋ฒ ๋ฆฌํด๋ฉ๋๋ค.
ํ ๋ฒ์ ํธ์ถํ ํ๋ก์ธ์ค์์(๋ถ๋ชจ), ๋ค๋ฅธ ํ ๋ฒ์ ์๋กญ๊ฒ ์์ฑ๋ ์์ ํ๋ก์ธ์ค์์ ๋ฆฌํด๋ฉ๋๋ค.
๋ถ๋ชจ์์ fork๋ ์์์ PID๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์์์์ fork๋ 0์ ๋ฆฌํดํฉ๋๋ค.
์์์ PID๋ ํญ์ 0์ด ์๋๊ธฐ ๋๋ฌธ์, ๋ฆฌํด ๊ฐ์ ํตํด ํ๋ก๊ทธ๋จ์ด ๋ถ๋ชจ์์ ์คํํ๊ณ ์๋์ง ์์์์ ์คํํ๋์ง๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
์์ ๋ ์๋์ ๊ฐ์ต๋๋ค.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int x = 1;
pid_t pid = fork();
if (pid == 0) {
printf("Child has x = %d\n", ++x);
} else {
printf("Parent has x = %d\n", --x);
}
printf("Bye for process %d with x = %d\n", getpid(), x);
}
์ด ์์ ๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ ํน์ง๋ค์ ์ ์ ์์ต๋๋ค.
fork๋ ํ ๋ฒ ํธ์ถํ๊ณ ๋ ๋ฒ ๋ฆฌํดํฉ๋๋ค.
๋์ ์คํ:
๋ถ๋ชจ์ ์์์ ๋์์ ๋์๊ฐ๋ ๋ณ๋์ ํ๋ก์ธ์ค๋ค์ ๋๋ค.
์ด๋ค์ ๋ ผ๋ฆฌ์ ์ ์ดํ๋ฆ ๋ด์ ์ธ์คํธ๋ญ์ ๋ค์ ์ปค๋์ ์ํด์ ์์์ ์์๋ก ์ค์ฒฉ๋ ์ ์์ต๋๋ค.
์ค๋ณต๋, ๊ทธ๋ฌ๋ ๋ณ๋์ ์ฃผ์๊ณต๊ฐ:
์์ ์์ ์์ ์ง์ญ๋ณ์ x๋ fork ํจ์๊ฐ ํธ์ถ๋์ด ๋ฐํ๋๋ ์๊ฐ์ ๋ถ๋ชจ์ ์์ ๋ชจ๋์์ 1์ ๊ฐ์ง๋๋ค.
๊ทธ๋ ์ง๋ง ๋ถ๋ชจ์ ์์์ด ๋ณ๋์ ํ๋ก์ธ์ค์ด๋ฏ๋ก ์ด๋ค์ ์์ ๋ง์ ์ฌ์ ์ธ ์ฃผ์๊ณต๊ฐ์ ๊ฐ์ง๋๋ค.
๋ฐ๋ผ์ fork ์ดํ ๋ถ๋ชจ๊ฐ x๋ฅผ ๋ณ๊ฒฝํ์๋๋ผ๋ ์์์์๋ ๋ฐ์๋์ง ์์ต๋๋ค.
๊ณต์ ๋ ํ์ผ:
์์ ํ๋ก๊ทธ๋จ์ ์คํํ ๋, ๋ถ๋ชจ์ ์์ ๋ชจ๋๊ฐ ์์ ์ ์ถ๋ ฅ์ ํ๋ฉด์ ํตํด์ ์งํํฉ๋๋ค.
์ด์ ๋ ์์์ ๋ถ๋ชจ๊ฐ ์คํํ ๋ชจ๋ ํ์ผ๋ค์ ์์๋ฐ์๊ธฐ ๋๋ฌธ์ธ๋ฐ, ๋ถ๋ชจ๊ฐ fork๋ฅผ ํธ์ถํ ๋ stdout ํ์ผ์ ์ด๋ ค ์์ผ๋ฉฐ,
ํ๋ฉด์ผ๋ก ์ฌ์ง์ ๋์ด ์์ต๋๋ค.
์์์ ์ด ํ์ผ์ ์์ํ์๊ธฐ์, ์์ ์ ์ถ๋ ฅ๋ ํ๋ฉด์ผ๋ก ๊ฐ๊ฒ ๋ฉ๋๋ค.
์์ง ์๊ทธ๋์ ๋ํด ๋ค๋ฃจ์ง ์์์ง๋ง, ์ค์ํ ๋ด์ฉ์ด๋ฏ๋ก ์ฐ์ ์ ์ด๋๋๋ก ํ๊ฒ ์ต๋๋ค.
fork()๋ก ์์ฑ๋ ์์์ ๋ถ๋ชจ์ signal mask๋ฅผ ์์๋ฐ์ต๋๋ค.
๐ง ํ๋ก์ธ์ค์ ์ข ๋ฃ - exit
#include <stdlib.h>
void exit(int status);
exit ํจ์๋ ์ข ๋ฃ ์ํ status๋ก ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํฉ๋๋ค.
(exit status๋ฅผ ์ค์ ํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ฉ์ธ ํจ์์์ ์ ์ ๊ฐ์ ๋ฆฌํดํ๋ ๊ฒ์ ๋๋ค.)
atexit() ํจ์๋ exit() ํ ๋ ์คํํ ํจ์๋ฅผ ๋ฑ๋กํฉ๋๋ค.
void cleanUp() {
printf("Clean\n");
}
int main() {
atexit(cleanUp);
fork();
exit(0);
}
๐ง ์ข๋น ํ๋ก์ธ์ค
์ข ๋ฃ๋์์ง๋ง ์์ง ์ฒ๋ฆฌ๋์ง ์์ ํ๋ก์ธ์ค
์์ ํ๋ก์ธ์ค๊ฐ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ณด๋ค ๋จผ์ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ, ํด๋น ์์ ํ๋ก์ธ์ค๋ ์ข๋น ํ๋ก์ธ์ค๊ฐ ๋ฉ๋๋ค.
fork๋ฅผ ํตํด ์์ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋ ๋ค ๋ถ๋ชจ๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ exit ํน์ return ๋ฑ์ ํตํด ์ข ๋ฃ๋ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ๋ถ๋ชจ ํ๋ก์ธ์ค์์ ์ข ๋ฃ ์ํ๋ฅผ ํ์ํ๊ธฐ ์ํด์ ์ปค๋์ ์์ ํ๋ก์ธ์ค์ ์ต์ํ์ ์ ๋ณด(PID, ์ข ๋ฃ์ํ ๋ฑ)๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฆ ์์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ๋์์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์์์ ์ฐจ์งํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
์ข๋น ํ๋ก์ธ์ค๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข๋น ํ๋ก์ธ์ค์ ์ข ๋ฃ ์ํ๋ฅผ ํ์ํ์ฌ์ผ ํฉ๋๋ค.
์๋์์ ๋์ค๊ฒ ์ง๋ง ์ด๋ฅผ ์ํ ์์คํ ์ฝ์ด wait ํน์ waitpid ์ ๋๋ค.
๋ง์ฝ ์์ ์ ์ข๋น ํ๋ก์ธ์ค๋ฅผ ์๊ฑฐํ์ง ์๊ณ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃํ ๊ฒฝ์ฐ,
์ปค๋์ init ํ๋ก์ธ์ค(PID = 1)๊ฐ ํด๋น ์ข๋น ํ๋ก์ธ์ค๋ค์ ์๊ฑฐํ๋๋ก ํฉ๋๋ค.
์ฆ ๋ถ๋ชจ๊ฐ ์์์ ์ฒญ์ํ์ง ์๊ณ ์ข ๋ฃํ์๋๋ผ๋, init์ ์ํด ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ์์์ ์ข ๋ฃ๋์์ง๋ง ๋ถ๋ชจ๊ฐ ์ข ๋ฃ๋์ง ์๋ ์ํฉ(์๋ฅผ ๋ค์ด ์ ๋๋ ์๋ฒ)์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉฐ, ์ด๋ฌํ ๊ฒฝ์ฐ ๋ฐ๋์ ๋ถ๋ชจ ํ๋ก์ธ์ค์์ ์ข๋น ํ๋ก์ธ์ค๋ฅผ ์ ๊ฑฐํด ์ฃผ์ด์ผ ํฉ๋๋ค.
๐ defunct
์์๋ฅผ ์ํด fork7.c ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <signal.h>
#include <fcntl.h>
#include <errno.h>
void fork7() {
if (fork() == 0) {
exit(0);
}
while(1){}
}
int main() {
fork7();
return 0;
}
์ด๋ฅผ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด ์คํ์ํจ ํ, ps๋ฅผ ์ณ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
./fork7 &
&๋ ์๋์์ ๋์ค๊ฒ ์ง๋ง, ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ์ํจ๋ค๋ ์๋ฏธ์ ๋๋ค.
๋ณด๋ฉด ์์ ํ๋ก์ธ์ค(PID = 300592)๊ฐ defunct๋ก ๋์ต๋๋ค.
์คํ์ ์๋ฃํ์ง๋ง ํ๋ก์ธ์ค ํ ์ด๋ธ์์ Parent ํ๋ก์ธ์ค์ ์๋ฃ ์ํ๋ฅผ ์ ๋ฌํ์ง ๋ชปํ ํ๋ก์ธ์ค๋ฅผ Defunct ํ๋ก์ธ์ค๋ผ๊ณ ๋ถ๋ฆ ๋๋ค
๐ง ๊ณ ์ ํ๋ก์ธ์ค
๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ณด๋ค ๋จผ์ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ, ํด๋น ์์ ํ๋ก์ธ์ค๋ฅผ ๊ณ ์ ํ๋ก์ธ์ค๋ผ ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ ์ปค๋์ ์ํ์ฌ ๊ณ ์ ํ๋ก์ธ์ค๋ init ํ๋ก์ธ์ค์๊ฒ๋ก ์ ์๋ฉ๋๋ค.
์ดํ ๊ณ ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด init์ผ๋ก ํ์ฌ๊ธ wait๋ฅผ ํตํด ๊ณ ์ ํ๋ก์ธ์ค๋ฅผ ์ ๊ฑฐํ์ฌ ์ข๋น๊ฐ ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๐ง ์ข๋น๋ฅผ ์ ๊ฑฐํ๋ wait์ waitpid
โญ๏ธ wait - ์์ ํ๋ก์ธ์ค์ ๋๊ธฐํํ๊ธฐ
wait๋ฅผ ํตํด ์์ ํ๋ก์ธ์ค๋ฅผ ์ง์ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
wait๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int * child_status);
wait๋ ํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์์ ์ ์์ ํ๋ก์ธ์ค๋ค ์ค ํ๋(์์)๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์ ์ง์ํต๋๋ค.
wait ํจ์์ ๋ฆฌํด ๊ฐ์ ์ข ๋ฃํ ์์ ํ๋ก์ธ์ค์ pid๊ฐ ๋๋ฉฐ, ๋ง์ฝ child_status๊ฐ NULL์ด ์๋ ๊ฒฝ์ฐ์๋,
์์ ํ๋ก์ธ์ค์ ์ข ๋ฃ ์ด์ ๋ฅผ ๋ํ๋ด๋ ์ํ ์ ๋ณด๊ฐ ๋ด๊น๋๋ค.
์ดํ ์ปค๋์ ์์ ํ๋ก์ธ์ค๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
โญ๏ธ waitpid- ํน์ pid์ ํ๋ก์ธ์ค์ ๋๊ธฐํํ๊ธฐ
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int * child_status, int options);
๋๊ธฐ ์งํฉ์ ๋ฉค๋ฒ๋ค์ pid์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋๋ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
pid > 0 : ๋๊ธฐ ์งํฉ์ ์ธ์๋ก ์ ๋ฌ๋ pid๊ณผ ๋์ผํ ๊ฐ์ PID๋ฅผ ๊ฐ๋ ์์ ํ๋ก์ธ์ค์ ๋๋ค. (๋จ์ผ)
pid = -1 : ๋๊ธฐ ์งํฉ์ ๋ถ๋ชจ์ ๋ชจ๋ ์์ ํ๋ก์ธ์ค์ ๋๋ค.(์์)
options๋ก ์ธํด ๊ฒฐ์ ๋๋ ํ๋์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
options๋ 0์ธ ๊ฒฝ์ฐ ๋๊ธฐ ์งํฉ(wait set) ๋ด์ ํ๋์ ์์์ด ์ข ๋ฃ๋ ๋๊น์ง ํธ์ถํ ํ๋ก์ธ์ค์ ์คํ์ ์ ์ง์ํต๋๋ค.
WNOHANG( ==1 ) ์ธ ๊ฒฝ์ฐ ๋จ ํ๋ฒ๋ง ์ฒดํฌํ์ฌ, ๋๊ธฐ ์งํฉ ๋ด ์์ ํ๋ก์ธ์ค ์ค ์ข ๋ฃ๋ ๊ฒ์ด ์๋ค๋ฉด ์ฆ์ ๋ฆฌํดํฉ๋๋ค.
WUNTRACED( ==2 ) ์ธ ๊ฒฝ์ฐ ๋๊ธฐ ์งํฉ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ฑฐ๋ ์ ์ง๋ ๋๊น์ง ํธ์ถํ ํ๋ก์ธ์ค์ ์คํ์ ์ ์งํฉ๋๋ค.
(์ด๋ ์ ์ง๊ฐ ์๋ฏธํ๋ ๊ฒ์ SIGSTOP, SIGTSTP ๋ฑ์ ํตํ ์ ์ง ์ํ์ ์๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ,
sleep ํน์ pause๋ก ์ธํ ์ ์ง๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค.)
WCONTINUED(== 8)
๋๊ธฐ ์งํฉ์ ์ํ ๋์ํ๋ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋๊น์ง, ๋๋ ๋๊ธฐ ์งํฉ์ ์ํ ์ ์งํ ํ๋ก์ธ์ค๊ฐ SIGCONT ์๊ทธ๋์ ๋ฐ๊ณ ๋ค์ ์คํ์ ์์ํ ๋๊น์ง ํธ์ถํ๋ ํ๋ก์ธ์ค์ ์คํ์ ์ ์ํฉ๋๋ค.
์ต์ ๋ค์ ORํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด WNOHANG | WUNTRACED ๋ฅผ ์ฌ์ฉํ๋ฉด, ๋๊ธฐ ์งํฉ์ ํ๋ก์ธ์ค๊ฐ ์ ์งํ์ ๋์๋ ํ์ํ ์ ์์ต๋๋ค.
๋ง์ฝ ์๋ฌด๊ฒ๋ ์ ์งํ๊ฑฐ๋ ์ข ๋ฃ๋์ง ์์๋ค๋ฉด WNOHANG์ฒ๋ผ ๋์ํฉ๋๋ค.
waitpid(-1, &status, 0)์ wait(&status)์ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
๐ ์ฒญ์๋ ์์์ exit ์ํ ์ฒดํฌํ๊ธฐ
wait ํน์ waitpid์ child_status ์ธ์๊ฐ NULL์ด ์๋๋ผ๋ฉด, ๋ฆฌํด์ ํ๋๋ก ๋ง๋ ์์ ํ๋ก์ธ์ค์ ๋ํ ์ํ ์ ๋ณด๋ฅผ status๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
wait.h ํ์ผ์ status ์ธ์๋ฅผ ํด์ํ๊ธฐ ์ํ ์ฌ๋ฌ ๋งคํฌ๋ก๋ฅผ ์ ์ํฉ๋๋ค.
WIFEXITED(status) : ์์์ด exit ํธ์ถ ๋๋ ๋ฆฌํด์ ํตํด์ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋์๋ค๋ฉด true๋ฅผ ๋ฆฌํดํฉ๋๋ค.
WEXITSTATUS(status) : ์ ์์ ์ผ๋ก ์ข ๋ฃ๋ ์์์ exit status๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์ด status๋ WIFEXITED()๊ฐ true๋ฅผ ๋ฆฌํดํ ๊ฒฝ์ฐ์๋ง ์ ์๋ฉ๋๋ค.
WIFSIGNALED(status) : ์์์ด ์ด๋ค ์๊ทธ๋์ ํตํด ์ข ๋ฃ๋์๋ค๋ฉด true๋ฅผ ๋ฆฌํดํฉ๋๋ค.
WTERMSIG(status) : ์์ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ฒ ํ ์๊ทธ๋์ ๋ฒํธ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์ด status๋ WIFSIGNALED()๊ฐ true๋ฅผ ๋ฆฌํดํ ๊ฒฝ์ฐ์๋ง ์ ์๋ฉ๋๋ค.
WIFSTOPPED(status) : ๋ฆฌํด์ ํ๊ฒ ํ ์์์ด ํ์ฌ ์ ์ง๋ ์ํ๋ผ๋ฉด true๋ฅผ ๋ฆฌํดํฉ๋๋ค.
WSTOPSIG(status) : ์์ ํ๋ก์ธ์ค๋ฅผ ์ ์งํ๊ฒ ํ ์๊ทธ๋์ ๋ฒํธ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
์ด status๋ WIFSTOPPED()๊ฐ true๋ฅผ ๋ฆฌํดํ ๊ฒฝ์ฐ์๋ง ์ ์๋ฉ๋๋ค.
WIFCONTINUED(status) : ๋ง์ผ ์์ ํ๋ก์ธ์ค๊ฐ SIGCONT ์๊ทธ๋์ ๋ฐ์์ ์ฌ์์๋์๋ค๋ฉด true๋ฅผ ๋ฆฌํดํฉ๋๋ค.
๐ง ํ๋ก์ธ์ค ์ฌ์ฐ๊ธฐ
unsigned int sleep(unsigned int secs);
์๊ธฐ ์์ ์ secs์ด ๋์ ์ฌ์๋๋ค.
์ ์์ ์ผ๋ก ๊นจ์ด๋๋ ๊ฒฝ์ฐ 0์ ๋ฐํํ๊ณ , ๊ทธ ์ธ์ ๊ฒฝ์ฐ(์๊ทธ๋์ ์ํด ๊นจ์ด๋๋ ๊ฒฝ์ฐ)์๋ ์์ฌ ์๊ฐ์ ์ด๋ก ๋ฆฌํดํฉ๋๋ค.
int pause(void);
์๊ธฐ ์์ ์ ์๊ทธ๋(signal)์ ๋ฐ์ ๋๊น์ง ์ฌ์๋๋ค.
๐ง ์ ํ๋ก๊ทธ๋จ์ ๋ก๋ฉ๊ณผ ์คํ - execve
execve ํจ์๋ ํ์ฌ ํ๋ก๊ทธ๋จ์ ์ปจํ ์คํธ ๋ด์์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ก๋ํ๊ณ ์คํํฉ๋๋ค.
int execve(char * filename, char * argv[], char * envp[]);
- filename : ์คํ๊ฐ๋ฅ ๋ชฉ์ ํ์ผ ์ด๋ฆ
- argv : ์ธ์ ๋ฆฌ์คํธ
- envp : ํ๊ฒฝ๋ณ์ ๋ฆฌ์คํธ
execve ํจ์๋ ์๋ฅผ ์ฌ์ฉํด์ filename์ ๋ก๋ํ๊ณ ์คํํฉ๋๋ค.
์ด๋ argv๋ก ์ธํด ํ์ฌ ์ปจํ ์คํธ(code, data, stack ๋ฑ)๊ฐ ๋ฎ์ด ์์์ง๋๋ค.
argv์ envp๋ ๋ ๋ฌธ์๋ก ๋๋๋ ํฌ์ธํฐ ๋ฐฐ์ด์ด๋ฉฐ, ๊ด์ต์ ์ํด argv[0]์ ์คํ๊ฐ๋ฅ ๋ชฉ์ ํ์ผ์ ์ด๋ฆ์ด ๋ค์ด๊ฐ๋๋ค.
execve๋ ํ์ผ ์ด๋ฆ์ ์ฐพ์ ์ ์๋ ์๋ฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ํธ์ถํ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ๋ฆฌํดํฉ๋๋ค.
์ด์ธ์ ๊ฒฝ์ฐ execve๋ ์ ๋ ๋ฆฌํดํ์ง ์์ต๋๋ค.
(๋ฆฌํดํ๋ ๊ฒฝ์ฐ -1)
โญ๏ธ ํ๋ก์ธ์ค VS ํ๋ก๊ทธ๋จ
ํ๋ก๊ทธ๋จ์ ์ฝ๋์ ๋ฐ์ดํฐ๊ฐ ํฉ์ณ์ง ๊ฒ์ผ๋ก, ๋์คํฌ ์์ ๋ชฉ์ ํ์ผ์ด๋ ์ฃผ์๊ณต๊ฐ์ ์ธ๊ทธ๋จผํธ๋ก ์กด์ฌํ ์ ์์ต๋๋ค.
ํ๋ก์ธ์ค๋ ์คํ์ค์ ์๋ ํ๋ก๊ทธ๋จ์ ํน์ ์ฌ๋ก๋ก์จ, ํ๋ก๊ทธ๋จ์ ํญ์ ์ด๋ค ํ๋ก์ธ์ค์ ์ปจํ ์คํธ ๋ด์์ ๋์๊ฐ๋๋ค.
์ด ์ฐจ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด fork์ execve๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
fork ํจ์๋ ๋ถ๋ชจ์ ๋ณต์ ์ธ ์๋ก์ด ์์ ํ๋ก์ธ์ค์์ ๋์ผํ ํ๋ก๊ทธ๋จ์ ์คํ์ํต๋๋ค.
(๋ค๋ฅธ ์ปจํ ์คํธ - ๋์ผ ํ๋ก๊ทธ๋จ)
execve๋ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ํ์ฌ ํ๋ก์ธ์ค์ ์ปจํ ์คํธ ๋ด์์ ๋ก๋ํ๊ณ ์คํํฉ๋๋ค.
(๊ฐ์ ์ปจํ ์คํธ - ๋ค๋ฅธ ํ๋ก๊ทธ๋จ)
๋ฐ๋ผ์ execve๋ก ์คํ๋๋ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๊ธฐ์กด ํ๋ก์ธ์ค์ ๋์ผํ PID๋ฅผ ๊ฐ์ง๋๋ค.
fork :
signal mask๋ ๋ถ๋ชจ์ ๊ฐ์ต๋๋ค. (์์)
๋ฑ๋ก๋ signal handler ์ญ์ ๋ถ๋ชจ์ ๊ฐ์ต๋๋ค.(์์)
execve:
signal mask๋ ๋์ผํฉ๋๋ค.
๋ฑ๋ก๋ signal handler๋ ์ด๊ธฐํ๋ฉ๋๋ค.
fork๋ฅผ ํตํด ์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ ๋ค, execve๋ฅผ ํตํด ์๋ก ์์ฑ๋ ์์ ํ๋ก์ธ์ค ๋ด์์ ์๋ก์ด ํ๋ก๊ทธ๋จ์ ๋ถ๋ฌ์ ์คํํ๋ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
์์๋ ์๋์ ๊ฐ์ต๋๋ค.
if ((pid = Fork()) == 0) { /* Child runs program */
if (execve(myargv[0], myargv, environ) < 0) {
printf("%s: Command not found.\n", myargv[0]);
exit(1);
}
}
๐ง parseline
parseline ํจ์๋ ์คํ์ด์ค๋ก ๊ตฌ๋ถ๋ ์ปค๋งจ๋๋ผ์ธ ์ธ์๋ค์ ๋ถ์ํ๊ณ , execve๋ก ์ ๋ฌ๋ ์ธ์๋ค(argv)๋ก ํ์ฑํฉ๋๋ค.
parseline์ ๋ค์ด์ค๋ ๋ง์ง๋ง ์ธ์๊ฐ "&" ์ด๋ผ๋ฉด, parseline์ 1์ ๋ฆฌํดํ๊ณ , ์ด ํ๋ก๊ทธ๋จ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. (์ด๋ ์์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ์ง ์์ต๋๋ค.)
์ด ์ธ์ ๊ฒฝ์ฐ์๋ 0์ ๋ฐํํ๋ฉฐ, ์ด๋ ์ด ํ๋ก๊ทธ๋จ์ด foreground์์ ์คํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค.
(์์ ํด๋น ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฝ๋๋ค.)
๐ง Built-in ๋ช ๋ น์ด์ Utility ํ๋ก๊ทธ๋จ
Built-in ๋ช ๋ น์ด๋ ์์ ๋ด์ฅ๋ ๋ช ๋ น์ด๋ฅผ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด ls ๋ฑ์ด ํ๋์ ์์๊ฐ ๋ ์ ์์ต๋๋ค.
Utility ํ๋ก๊ทธ๋จ์ ์ด๋ฆ์ด ๋ค์ด์จ ๊ฒฝ์ฐ ํด๋น ์ด๋ฆ์ ๊ฐ์ง ์คํ ํ์ผ์ ์ฐพ์ ์คํ์ํต๋๋ค.
์ด๋ค ๋ช ๋ น์ด๊ฐ ํ์ผ๋ก์จ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ ์์ค์ฝ๋๋ก ๊ตฌํ๋์ด ์๋ค๋ฉด ์ด๋ built-in ๋ช ๋ น์ด์ ๋๋ค.
๐ง ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ฑ
โญ๏ธ Job
Shell์ด ์ฌ์ฉํ๋ ์ถ์ํ๋ก ํ ๊ฐ์ ์ปค๋งจ๋๋ผ์ธ์ ์คํํด์ ์์ฑ๋ ํ๋ก์ธ์ค๋ค์ ์๋ฏธํฉ๋๋ค.
์ด๋ ํ ์๊ฐ์ ์กด์ฌํ ์ ์๋ Job์, ์ต๋ ํ๋์ foreground job๊ณผ, 0๊ฐ ์ด์์ background job์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
โญ๏ธ Job์ ์ ์ด
foreground job์ ์ ์ง์ํค๋ ค๋ฉด Ctrl + z ๋ฅผ ํตํด SIGSTOP ์๊ทธ๋์ ๋ณด๋ด์ผ ํฉ๋๋ค.
์ดํ fg๋ฅผ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ ์ ์ง๋ ์์ ์ ๋ค์ foregrond๋ก ์คํํ๋ฉฐ, bg๋ฅผ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ background๋ก ์คํํฉ๋๋ค.
(SIGCONT ์๊ทธ๋์ ๋ณด๋)
โญ๏ธ background ์์
background job์ผ๋ก ์คํ์ํค๊ธฐ ์ํด์๋ ์ปค๋งจ๋๋ผ์ธ์ ์ ๋ ฅํ๋ ๋ช ๋ น์ด์ ๋ง์ง๋ง์ &๋ฅผ ์ ๋ ฅํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด parseline ํจ์์์๋ 1์ ๋ฐํํ๊ณ , ์ด๋ ์์ ์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ๋์ด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ํค๋ณด๋๋ฅผ ์ ์ดํ์ง ์์ต๋๋ค.
์ ์ฌ์ง์์ ๋นจ๊ฐ ๋ถ๋ถ์ ๊ดํธ๋ฅผ ๋ณด๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ผ๋ก ์ํ๋์ด์ผ ํ ๋์ ๊ณผ์ ์ ์ฒ๋ฆฌํ ๋ถ๋ถ์ ๋๋ค.
์ด๋ ์ค์ํ ๊ฒ์ด ํด๋น ๋ถ๋ถ์ ๊ฒฝ์ฐ waitpid๋ฅผ ํตํด ์์์ ์ ๊ฑฐํด ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ fork๋ก ์ธํด ์์ฑ๋ ์์๋ค์ด ์ฃฝ์ผ๋ฉด ์ข๋น๋ก ๋ณํฉ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด waitpid๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ ๋์ด์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ์๋๊ฒ ๋ฉ๋๋ค. (waitํ๋ ๋์ ์์ ์ฌ์ฉํ์ง ๋ชปํ๋ฏ๋ก)
waitpid๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํฌ๊ทธ๋ผ์ด๋ ์์ ์ด,
์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ๋ฉ๋๋ค.
๊ทธ๋ผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ ๊ฑฐํ๊ธฐ ์ํด์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ ๊ฑฐํ๊ธฐ ์ํด์ Signal ์ด๋ผ๊ณ ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
Signal์ ๋ค์์ ์ด์ด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'๐ฅ Computer Science > ์์คํ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์์คํ ํ๋ก๊ทธ๋๋ฐ] Shall Lab (0) | 2022.11.24 |
---|---|
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [3] - ์๊ทธ๋ (0) | 2022.11.10 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [1] - ํ๋ก์ธ์ค (0) | 2022.11.07 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ํ๋ก์ธ์ค [0] - ์ ์ด ํ๋ฆ๊ณผ ์์ธ ์ํฉ (0) | 2022.11.07 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ๋ฒํผ ์ค๋ฒํ๋ก์ฐ (0) | 2022.10.25 |