为啥该行没有复制到子进程的地址空间中?

Posted

技术标签:

【中文标题】为啥该行没有复制到子进程的地址空间中?【英文标题】:Why the line is not copied in the address space of child process?为什么该行没有复制到子进程的地址空间中? 【发布时间】:2013-03-27 11:48:02 【问题描述】:
   #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.
&第 (6) 行到第 (7) 行构成子进程,fork() 之上的任何内容,即从第 (1) 行到第 (2) 行无论如何都被复制到子进程的地址空间。我对上述观点是否正确?那为什么line#(2)没有打印两次,一个在子进程,另一个在父进程?

【问题讨论】:

【参考方案1】:

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

(如果您希望子进程从头开始,您应该在子进程中使用fork(),后跟exec()。)

【讨论】:

>那么说child得到其父母地址空间的副本是什么意思。第2行在父母地址空间中对吗? @SubiPuthalath:是的,但是那行已经被执行了。孩子fork()之后继续。 >好的,我明白了。所以你的意思是说只有变量的值(可以在堆中或堆栈中)只被复制到子地址空间。 所有内容都会被复制,包括变量的值、代码以及代码中执行到达的点。就您的代码而言,唯一的区别是fork() 的返回值。子代码 (2) 中存在的代码并不意味着该代码会在子代码中执行 - 执行点已经超出了它。 >感谢您的精彩解释【参考方案2】:

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

【讨论】:

>谢谢 Eva 的解释

以上是关于为啥该行没有复制到子进程的地址空间中?的主要内容,如果未能解决你的问题,请参考以下文章

fork和vfork

Linux学习之“vfork函数”

12.9 线程与fork

父子进程地址空间堆空间

为啥每个进程都需要自己的页表?

linux为啥需要内核栈,系统调用时直接使用用户栈不行吗