为什么不在子进程的地址空间中复制该行?

时间:2013-03-27 11:48:03

标签: ipc

   #include<stdio.h>---->(1)
    int main()
    {
        int i;
        int j,K;
        j = 200;
        K = 300;
        printf("Before forking: j = %d, K = %d\n ", j, K);---->(2)
        i = fork();---->(3) /* Calling fork() */
       if (i > 0) { /* Parent Process */ ----->(4)    
         sleep(10);/* Delay the parent */
         printf("After forking, parent: j = %d, K = %d\n", j, K);
       } ----->(5)

      else {----->(6)  /* Child process */
        j++;
        K++;
        printf("After forking, child: j = %d, K = %d\n", j, K);
      }---->(7)

   o/p of the above pgm is 
   Before forking: j = 200, K = 300
   After forking, child: j = 201, K = 301
   After forking, parent: j = 200, K = 300.

由于我是IPC的初学者,所以在首先回答这个问题之前,我想确保我的理解是正确的。排行#(1)到第(2)行&amp;第(4)行到第5行构成父进程&amp;第(7)行到第(7)行构成了子进程,fork()之上的任何东西,即从第(1)行到第(2)行的任何东西都被复制到了child的地址空间。我对上述点有什么看法?那么为什么第#(2)行不能打印两次,一个在子进程中,另一个在父进程中。?

2 个答案:

答案 0 :(得分:0)

父母和孩子都在呼叫fork()后继续。孩子不会在main()的顶部重新开始。

(如果您希望子进程从头开始,则应使用fork(),然后立即使用exec()。{/ p>

答案 1 :(得分:0)

子进程继承父进程的上下文,并在fork()之后继续执行。通常,exec()在child()中的folk()之后调用,exec()覆盖父级的上下文,让子项运行全新。