-
Notifications
You must be signed in to change notification settings - Fork 2
vfork
flowergom edited this page Oct 27, 2015
·
1 revision
vfork는 fork처럼 새 프로세스를 생성하나, 부모의 공간을 자식에게 복사하지 않는다는 차이가 있다. 자식은 vfork를 호출한 직후 exec를 호출 하는데, 자신만의 주소 공간을 가질 필요가 없기 때문이다. 그리고 또한 자식이 먼저 실행됨을 보장한다. 자식이 exec나 exit를 호출하기 전까지는 부모의 실행이 유보된다.
#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