APUE2e Exercise 8.2: vfork v.s. fork
November 10th, 2011
No comments
?Download exercise8-2.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | /* * 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); } |