vfork - ggubuk97/apue GitHub Wiki
vfork
vfork๋ fork์ฒ๋ผ ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋, ๋ถ๋ชจ์ ๊ณต๊ฐ์ ์์์๊ฒ ๋ณต์ฌํ์ง ์๋๋ค๋ ์ฐจ์ด๊ฐ ์๋ค. ์์์ vfork๋ฅผ ํธ์ถํ ์งํ exec๋ฅผ ํธ์ถ ํ๋๋ฐ, ์์ ๋ง์ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ์ง ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ํ ์์์ด ๋จผ์ ์คํ๋จ์ ๋ณด์ฅํ๋ค. ์์์ด exec๋ exit๋ฅผ ํธ์ถํ๊ธฐ ์ ๊น์ง๋ ๋ถ๋ชจ์ ์คํ์ด ์ ๋ณด๋๋ค.
example 8.3
#include "apue.h"
int globvar = 6;
int main(void)
{
int var;
pid_t pid;
/* external variable in initialized data */
/* automatic variable on the stack */
var = 88;
printf("before vfork\n");
if ((pid = vfork()) < 0) {
err_sys("vfork error");
} else if (pid == 0) {
printf("child process\n");
globvar++;
var++;
_exit(0);
} else {
printf("parent process\n");
}
/* parent continues here */
printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar,var);
exit(0);
}
์คํ ๊ฒฐ๊ณผ
$ ./8.3.out
before vfork
child process
parent process
pid = 2626, glob = 7, var = 89
์์ ํ๋ก์ธ์ค๊ฐ ๋ณ์๋ค์ ์ฆ๊ฐํ๋ ์ค์ ๋ก ๋ถ๋ชจ์ ๋ณ์๋ค๋ ๋ณ๊ฒฝ๋๋ค. ์์์ด ๋ถ๋ชจ์ ์ฃผ์ ๊ณต๊ฐ์์ ์คํ๋จ ์์ ํจ์์์ exit ๋์ _exit ํจ์๋ฅผ ํธ์ถ ํ์๋๋ฐ. _exit๋ ํ์ค ์ ์ถ๋ ฅ ๋ฒํผ๋ค์ ์ ํ ๋ฐฉ์ถํ์ง ์๋๋ค๊ณ ํ๋ค. ๋ง์ผ exit๋ฅผ ํธ์ถํ๋ฉด ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋ถํ์ค ํ๋ค๊ณ ์ฑ ์์ ์ด์ผ๊ธธ ํ๋๋ฐ, ๊ทธ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ด _exit ์คํํ ๊ฒฐ๊ณผ์ ๊ฐ๋ค.(MACOS ver10.11)
$ ./8.3.out
before vfork
child process
parent process
pid = 2643, glob = 7, var = 89