如何在fork()调用期间共享用户程序和数据以及为什么子进程在fork()调用之前完成运行?

时间:2014-01-27 13:28:33

标签: c unix fork

   #include<stdio.h>
    main() 
    {
     int a=9;
     printf(" %u hiii \n",&a);
     int p=fork();
     if(p==0){
             a=10;
             printf("\nChild  %u \n Value in child of a = %d\n",&p,a);
              }
     else
             printf("\nvalue of a = %d \n Parent with child process id = %d address of p = %u \n",a,p,&p);
     }

以上程序的Ouptut根据ideone.com是 - &gt;

 3215698376 hiii 

 value of a = 9 

 Parent with child process id = 28150 address of p = 3215698380 

3215698376 hiii 

Child  3215698380 

Value in child of a = 10

我的问题是,如果两个进程都给出变量'a'的相同地址,那么如果我在一个进程中更改值,为什么不是在Parent进程中反映的更改。 此外,为什么子进程运行整个程序,它应该在fork()之后运行语句。

1 个答案:

答案 0 :(得分:2)

问题评论中的链接回答了内存地址问题。

对于在父应用程序和子应用程序中打印出的“hiii”行,由于stdout的缓冲,子节点打印出“hiii”行。在fork()时,该行仍在内存中缓冲,并且在下一个printf或程序退出之前不会刷新到stdout。所以孩子真的开始在叉线执行。

尝试添加setvbuf(stdout, NULL, _IONBF, 0);作为程序的第一行(或至少在第一个printf之前),看看孩子是否仍打印出“hiii”行。