Re: vfork implementation...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 6/14/06, Abu M. Muttalib <abum@xxxxxxxxx> wrote:
Hi,

This mail is intended for Robert Love, I hope I can find him on the list.

Please refer to Pg 24 of chapter 2 of Linux Kernel Development.

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.

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.


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);
        }
}
----------------------------------------------------------------------------
---------------------------------------

Regards,
Abu.


--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux