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