On 6/14/06, Jinesh K J <jineshkj.newsletters@xxxxxxxxx> wrote:
Exactly, it does not mention in the man page of vfork that the child is NOT ALLOWED to write to the address space.
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.
Btw, the same code gives Segmentation Fault on my Solaris 8 machine !!!!
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 !!!!
--
Raseel.