Hi Vinod,
calling fork or any family of fork calls will call the "clone" system call
with different parameters. Most implementations of pthreads also call the
clone system call. In case of fork, the data section,stack/heap are copied.
only the text section is common since it is supposed to be execute only
whereas the other section contents could be modified. There is this COW
(copy on write) feature wherein the data/stack/heap sections are replicated
the first time any of its contents are modified in any of the 2 processes.
In the below code, You are creaing a child process using the fork() lib call
and waiting in the parent for the child to complete execution. In the child,
from the function "main", you are modifying the contents of local (stack)
variable "var" which means COW would occur and the stack is replicated.
Which means that address (physical) of "var" is now "different" in the two
processes but the virtual address can be same and hence the value of var in
only the child is incremented. When I say "different". I'am referring to
the physical memory address. You must remember that you are running the
processes in different virtual memory spaces. So, the address "bff5a700" is
the virtual address. But the physical address of "var" will be different for
the two processes. The OS and MMU together make it transparent to the user
space processes. To the user space, the entire memory address space is
dedicated to itself. The actual virtual-physical address mapping is handled
by the MMU/OS together.
Hope this answers your Q
Regards,
-Rajesh TN
On Fri, Apr 3, 2009 at 5:52 PM, vin_vrs <vinod.chum@...> wrote:
> My queries are :
> 1. how the fork actually works regarding the memory space of child and
> parent
> 2. the below code shows same address for a auto variable "var" , but
> different values in case of parent and child.
> 3. how could same address contain two different values.
>
> /* the code may look big, but its relatively simple, plz
> * do look into it
> */
> /* headers included */
> int main( int argc, char* argv[] ){
> pid_t pid;
> int var = 0;
>
> printf("before fork address of var = %x\n", &var);
>
> if( (pid = fork()) < 0 )
> perror("perror");
> if( pid == 0 ){
>
> printf("child process running pid = %d \n",getpid());
> var++;
> printf("child address of &var = %x\n", &var);
> printf("child value of var = %d\n", var);
> }
> else{
> wait();
> printf("parent process running = %d \n",getpid());
> printf("parent address of &var = %x\n", &var);
> printf("parent value of var = %d\n", var);
> }
>
> exit(0);
>
> }
>
> /* sample output */
>
> [root@localhost process]# cc p2.c -o p2.out
> [root@localhost process]# ./p2.out
> before fork address of var = bff5a700
> child process running pid = 3918
> child address of &var = bff5a700
> child value of var = 1
> parent process running = 3917
> parent address of &var = bff5a700
> parent value of var = 0
>
> Thanks in advance,
> Vinod
>
>
>
--
______________________________
Regards
Rajesh T.N.
[Non-text portions of this message have been removed]