in Operating System edited by
37,066 views
123 votes
123 votes
Consider the following code fragment:
if (fork() == 0)
{
   a = a + 5;
   printf("%d, %p n", a, &a);
}
else
{
   a = a - 5;
   printf ("%d, %p n", a,& a);
}

Let $u,v$ be the values printed by the parent process and $x,y$ be the values printed by the child process. Which one of the following is TRUE?

  1. $u = x + 10  \text{ and } v = y$
  2. $u = x + 10 \text{ and } v != y$
  3. $u + 10 = x \text{ and } v = y$
  4. $u + 10 = x \text{ and } v != y$
in Operating System edited by
37.1k views

4 Comments

2
2
edited by

Key idea:     printf() prints logical addresses.

When we fork a new process, then the new child process so created (which is an exact copy of parent, except PID etc.) has same logical addresses of global and global static variables. Also local variables and static local variables of functions share same logical addresses.

In below image, we can see child and parent has same logical addresses for different kinds of variables.

Link to code

But we need to be careful in terms of block scope due to if-else constructs or others.

In below image, we see same variables within if-else has different addresses in parent and child (Same variables [eg. local, slocal ] appear to be one after other)

Link to code

1
1

9 Answers

81 votes
81 votes
Best answer

It should be Option C.

#include<stdio.h>
#include<stdlib.h>
void main()
{
    int a =100;
    if(fork()==0)
    {
     a=a+5;
     printf("%d %d \n",a,&a );
    }
   else
    {
     a=a-5;
     printf("%d %d \n",a,&a );
    }
}

Output:

Fork returns $0$ when it is a child process.

if ( fork == 0)              

Is true when it is child . Child increment valule of a .

In the above output:

  • $95$ is printed by parent : $\mathbf{u}$
  • $105$ is printed by child  : $\mathbf{x}$
    $\mathbf{\Rightarrow u+10=x}$

The logical addresses remains the same between the parent and child processes.

Hence, answer should be:

 $\mathbf{ u+10=x}$  and $\mathbf{v=y}$

edited by
by

4 Comments

@jatin

your logic seems to be correct for me
0
0
edited by
why not  v!=y???
0
0
Both variables can never be at same location v can never be equal to y.
1
1
40 votes
40 votes

answer is c because when child is created, it gets a saparate address space i.e. space in RAM and it clones entire address space of parent into it's own address space. so obviously the variable 'a' is also copied and physical address i.e. location in RAM would be different for both variables. but given program doesn't print the physical address, it prints the logical address i.e. distance between the location of variable in RAM and location of start of address space for the process i.e. relative location of variable with respect to start of it's address space which will be same for both parent and child since data is cloned.

 

in unix tho, address space of parent and child is also same until one of them tries to modify the contents of it's address space. then they are assigned different address spaces and cloning is done.

now before you go on to solve next question, you deserve to see this bunny with a backpack--

edited by

3 Comments

As you said the given program doesn't print the physical address, can you please explain why? I am not getting it
0
0
good explanation🐰🐇
0
0
thanks for the bunny!
2
2
36 votes
36 votes
(c) is the answer. Child is incrementing a by 5 and parent is decrementing a by 5. So, x = u + 10.

During fork(), address space of parent is copied for the child. So, any modifications to child variable won't affect the parent variable or vice-verse. But this copy is for physical pages of memory. The logical addresses remains the same between the parent and child processes.

4 Comments

@avinash Here &a means logical address bcoz of security matter ...
0
0
edited by
it should be option C ?
1
1
Wrong because child and parent are stored in separate memory locations. V can't be equal to Y.
0
0
11 votes
11 votes
fork() returns 0 in child process and process ID of child process in parent process.
In Child (x), a = a + 5
In Parent (u), a = a – 5;

Child process will execute the if part and parent process will execute the else part. Assume that the initial value of a = 6. Then the value of a printed by the child process will be 11, and the value of a printed by the parent process in 1. Therefore u+10=x.

the virtual address is same but virtual addresses exist in different processes’ virtual address space and when we print &a, it’s actually printing the virtual address. Hence the answer is v = y.
Answer:

Related questions