0)     wait();   else    *str='M';   printf("%x:%sn",(unsigned int)str,str);   return 0;   }          linux2.6....">

当前位置:  技术问答>linux和unix

关于fork()进程的一个简单问题!!!!!!!!!!!!!!!!

    来源: 互联网  发布时间:2016-10-21

    本文导语:        #include    #include    int main()   {   char buf[3]="AB";   char *str=buf;   if(fork()>0)     wait();   else    *str='M';   printf("%x:%sn",(unsigned int)str,str);   return 0;   }          linux2.6环境下编译运行,结果是: bfc807bd:MB...


 
  
 #include  
 #include  
 int main() 
 { 
 char buf[3]="AB"; 
 char *str=buf; 
 if(fork()>0) 
   wait(); 
 else 
  *str='M'; 
 printf("%x:%sn",(unsigned int)str,str); 
 return 0; 
 } 
  
  
 


linux2.6环境下编译运行,结果是:
bfc807bd:MB
bfc807bd:AB
我的疑问是:

子进程和父进程输出的str 地址都是bfc807bd,子进程修改了bfc807bd内存单元的值,为什么父进程输出的还是AB??
在父进程创建子进程后,子进程获得父进程的一个副本,包括数据段,栈空间,指令段等,既然str指向的都是同一个地址,为什么数据不同? 难道与进程的虚拟地址空间有关?

|

不需要深入理解都该明白,不同进程有各自的虚拟内存空间,两个地址都是虚拟的而已。应该系统地学习下。

|
str 地址都是bfc807bd ,它是两套系统内的地址,各自算各自的。

|
虚拟地址。

他们各自有各自的地址空间。

COW,写时复制。

然后各自有各自的地址空间。

|


cow全称copy on write:
linux下面有一个规定fork后的共享数据不会马上拷贝给子进程,而是当子进程在写数据区的时候会才开始拷贝父进程的数据,上面运行的结果也说明了这一点,父进程没有变化,子进程出现了变化。

|
1.基于效率的考虑,子进程创建时仅复制父进程的页表,因此子进程可以共享父进程的内存,只有子进程要更改内存数据时,操作系统才会复制对应的内存页。
2.程序里看到的地址都是虚拟地址,即使两个进程往同一个地址写,实际会映射到不同的地方.

|
我觉得是这样的,子进程执行时间可能在父进程的前面 也可能在后面,楼主可以尝试多执行几次。可能会有不同的结果、、、

|
虚拟地址撒,子进程和父进程都有独立的地址空间

|
ni ba thread he process gao hun luan le.

|
推荐 深入理解计算机系统 这本书,你看了之后就明白了。

|
不同进程有各自的虚拟内存空间。。。
学习了

|


差不多是这样

|
当你试图写的时候就会分配一个空间了 不和父进程共享了  读的时候不会   写时复制

|
当你写的时候就会重新非配一个空间不和父进程共享了  如果只是读读不会:写时复制

    
 
 

您可能感兴趣的文章:

  • 奇怪:程序一fork子进程时就停住了,似乎根本不能fork子进程啊?
  • 程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存
  • 主进程有两个线程,fork子进程后复制主进程两个线程的内存么?
  • 父进程发包,fork子进程收回传的包,sock_filter后,子进程收不到包
  • fork 一个字进程 将子进程的输出作为主进程的输入
  • fork出来的子进程能通知主进程自己的进度吗
  • 用fork产生一个进程,但是在子进程里无法监视父进程变量的变动。
  • 如果一个server进程要fork许多子进程,但不等待子进程终止,也不希望子进程结束后处于僵进程状态直到父进程终止。请问可采用什么方法实现
  • 调用fork操作后,子进程有返回,父进程挂死,什么原因?
  • fork一个子进程后在打开一个文件,如何在子进程中使用这个打开的文件描述符号
  • 问。fork()出来的子进程如果遇到brokenPIPE的错误,会影响父进程的关闭吗?
  • fork() 父子进程执行顺序问题
  • 怎样编写一段程序,要求调用fork并在子进程中建立一个新的对话期。验证子进程变成了进程组长而且不再有控制终端。
  • 请问fork子进程后,怎么修改子进程的所属用户。
  • fork出来的进程不能完全继承父进程的属性吗?
  • 创建进程的系统调用clone()和fork()
  • 在一个进程中我定义了几个全局变量,然后我又fork了几个子进程,子进程中是否可以各自对全局变量进行修改,如果各子进程都对其进行修改,
  • 关于fork创建进程的一个问题
  • 如何向由fork出来的进程家族发送信号?
  • fork()复制进程的问题2
  • 还是有关fork的问题,fork在一个函数中调用,我被搞胡涂了
  • 一个fork的问题
  • 新手的问题关于fork?
  • fork()函数入门级问题:fork()与进程数
  • fork的问题
  • 请教一个关于fork的问题。
  • minGW编译带fork函数的问题?
  • 一个简单的fork问题(那个高手来帮忙呀)
  • fork与socket问题
  • 关于fork()的一个问题!?
  • 问个关于fork的小问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • unix中的fork2与fork有设么区别?
  • 如何理解fork函数返回2次啊?
  • 急于明白Fork的用法.请提供中文解释.谢谢.
  • 关于fork的不解
  • 弱弱的问:fork和exec的区别是什么?
  • 关于fork的讨论
  • 关于fork的疑问?
  • fork之后的输出
  • exit和fork是什么关系?他们是怎么配合使用的?
  • fork函数,在线等待,马上结贴。谢谢!!!!!!!!!!!!
  • 请教 linux的fork从什么版本开始支持COW?
  • c++ 和 fork
  • "fork(2)" 中这个2表示什么意思
  • fork函数的源代码在哪呢
  • 关于fork函数
  • fork函数的理解。。
  • linux的fork()函数
  • 创建一个子进程,什么时候该用clone()而不是fork()?
  • Linux fork() 函数
  • fork()的疑问


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3