fork - ggubuk97/apue GitHub Wiki

fork

๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜. ์ด ํ•จ์ˆ˜๋Š” ์ƒ์„ฑํ•œ ์ƒˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค child process๋ผ ๋ถ€๋ฅธ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํ•œ๋ฒˆ ํ˜ธ์ถœ ๋˜๋‚˜ ๋‘๋ฒˆ ๋ฐ˜ํ™˜ ๋œ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค(fork ๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ”„๋กœ์„ธ์Šค)์˜ ๋ณต์‚ฌ๋ณธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž์‹์€ ๋ถ€๋ชจ์˜ ์ž๋ฃŒ๊ตฌ์—ญ๊ณผ ํž™, ์Šคํ…์˜ ๋ณต์‚ฌ๋ณธ์„ ๊ฐ€์ง„๋‹ค.

example 8.1
#include โ€œapue.h"
int     globvar = 6;  /* external variable in initialized data */
char    buf[] = "a write to stdout\n";
int main(void) {
  int     var;
  pid_t   pid;
  /* automatic variable on the stack */
  var = 88;
  if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
    err_sys("write errorโ€);
  printf("before fork\nโ€);
  if ((pid = fork()) < 0) {
    err_sys("fork error");
  } else if (pid == 0) {
    printf("child process\n");
    globvar++;
    var++;
  } else {
    printf("parent process\n");
    sleep(2);
    /* we donโ€™t flush stdout */
    /* child */
    /* modify variables */
    /* parent */
  }
  printf("pid = %ld, glob = %d, var = %d\n",(long)getpid(),globvar,var);
  exit(0);
}
์‹คํ–‰ ๊ฒฐ๊ณผ
$ ./8.1.out 
a write to stdout
before fork
parent process
child process
pid = 2596, glob = 7, var = 89 // child์˜ ๋ณ€์ˆ˜๋“ค์€ ๋ฐ”๋€๋‹ค.
pid = 2595, glob = 6, var = 88 // parent์˜ ๋ณ€์ˆ˜๋“ค์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

fork์ดํ›„์— ์ž์‹์ด ๋ถ€๋ชจ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰ ๋˜๋Š”์ง€(๋˜๋Š” ๋‚˜์ค‘์— ์‹คํ–‰๋˜๋Š”์ง€)๋Š” ์•Œ์ˆ˜์—†๊ณ , ์ˆœ์„œ๋Š” ์ปค๋„์˜ ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.