On 6/14/06, Raseel Bhagat <raseelbhagat@xxxxxxxxx> wrote:
Hi Abu, On 6/14/06, Jinesh K J <jineshkj.newsletters@xxxxxxxxx> wrote: > On 6/14/06, Abu M. Muttalib <abum@xxxxxxxxx> wrote: > > > As mentioned in the description of vfork call, it is said that child is not > > allowed to write to the address space, but in the following example its not > > so. The child is able to write to the process address space. This program > > was tested with Linux Kernel 2.6.9. Why is it so? > > i think you might probably have misread it. the child is not > disallowed to write to the address space, but its just not healthy. > since child is using the same address space as that of the parent, > whatever global variables accessed by the child and parent will both > be the same. Exactly, it does not mention in the man page of vfork that the child is NOT ALLOWED to write to the address space. > u can refer to the arch/xxx/kernel/process.c and see the sys_vfork > implementation. the child's virtual memory is a clone of that of the > parent. also note that the parent is put on hold till the child exits > or execvs, so that this technique cannot be used for truly parallel > IPC between parent and child. its intention is clearly mentioned in > the man page itself. Exactly, the vfork is primarily used in cases when it is expected that the child will execve immediately (before writing anything) after it is born. > > > > fork.c > > ---------------------------------------------------------------------------- > > --------------------------------------- > > #include <stdio.h> > > > > unsigned char *glob_var = NULL; > > > > void main() > > { > > int pid = -8,i; > > pid = vfork(); > > > > if(pid < 0) > > printf("\n FORK ERROR \n"); > > > > if(pid == 0) > > { > > unsigned char * local_var = NULL; > > local_var = (unsigned char *)malloc(5); > > strcpy(local_var,"ABCD"); > > glob_var = local_var; > > printf("\nCHILD :Value of glob_var is %X local_var is %X glob_var is %c > > \n",glob_var,local_var,*glob_var); > > for(i=0;i<4;i++) > > { > > printf("\n CHAR is %c \n",glob_var[i]); > > } > > printf("\nCHILD1 :Value of glob_var is %X %c\n",glob_var,*(glob_var)); > > } > > > > if(pid > 0) > > { > > printf("\nParent : Value of glob_var is %X %c\n",glob_var,*(glob_var)); > > free(glob_var); > > printf("\nParent : Value of glob_var is %X %c\n",glob_var,*(glob_var)); > > exit(0); > > } > > } > > ------------------------------ Btw, the same code gives Segmentation Fault on my Solaris 8 machine !!!!
i think its because the vfork implementation varies across platforms. may be in solaris, the child would be sharing parents VM but could be in write protected mode.
-- Raseel.
-- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/