vfork v.s. fork
/*
* exercise8-2.c
*
* Created on: Nov 10, 2011
* Author: zhuhuang
*/
#include <apueerr.h>
int glob = 6;
int callvfork(void)
{
int var=88;
pid_t pid;
//compare the running results using vfork and fork
/* Using fork
in main first:4656
before callvfork
in callvfork parent:4656
glob: 6, var: 88
in main second:4656
after callvfork
before anothercall
in anothercall:4656
after anothercall
in callvfork child:4661
in main second:4661
after callvfork
before anothercall
in anothercall:4661
after anothercall
*/
/* Using vfork
in main first:4608
before callvfork
in callvfork child:4613
in main second:4613
after callvfork
before anothercall
in anothercall:4613
after anothercall
in callvfork parent:4608
glob: 7, var: 2077184
*/
if((pid = fork()) < 0){
err_sys("vfork error");
}else if(pid == 0){
//the increasing of the variables done by the child changes the values in the parent
glob++;
printf("in callvfork child:%dn", getpid());
return 0;
}
printf("in callvfork parent:%dn", getpid());
printf("glob: %d, var: %dn", glob, var); //var is
}
int anothercall(void)
{
int i;
int buf[100];
for(i=0;i<100;i++)
buf[i]=1;
printf("in anothercall:%dn", getpid());
}
int main(void)
{
printf("in main first:%dn", getpid());
printf("before callvforkn");
callvfork();
//Using vfork: child process continues to execute the following code. But parent process doesn't.
//Using fork: both child and parent processes execute the following code.
printf("in main second:%dn", getpid());
printf("after callvforkn");
printf("before anothercalln");
anothercall();
printf("after anothercalln");
exit(0);
}