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

fork下父子进程内存的问题

    来源: 互联网  发布时间:2016-04-17

    本文导语:  我在父进程malloc了一段内存,fork()后这段内存被子进程拷贝,使用中与父进程不相互干扰,但奇怪的是这两端内存的地址竟然是一样的,而且我在子进程中free掉这段内存,也影响不到父进程 我的问题是: 既然是拷贝...

我在父进程malloc了一段内存,fork()后这段内存被子进程拷贝,使用中与父进程不相互干扰,但奇怪的是这两端内存的地址竟然是一样的,而且我在子进程中free掉这段内存,也影响不到父进程
我的问题是:
既然是拷贝过去的内存,那地址就不应该一样
既然地址一样,那就应该是一段相同的内存,free掉后就不会再受影响
请参照以下代码:

int main()
{
    char *buffer;
    buffer = (char*)malloc(100);
    memset(buffer, 0, sizeof(buffer));
    memcpy(buffer, "parent", sizeof("parent"));

    printf("buffer content in parent: %sn", buffer);
    printf("parent buffer address: %dn", (int)buffer);

    if (fork() == 0)
    {
        memset(buffer, 0, sizeof(buffer));
        memcpy(buffer, "child", sizeof("child"));
        
        //这儿输出的地址和父进程相同
        printf("buffer content in child: %sn", buffer);
        printf("child buffer address: %dn", (int)buffer);

        //free掉内存
        free(buffer);
        buffer = NULL;
        exit(0);
    }

    wait(NULL);
    
    printf("parent buffer address next: %dn", (int)buffer);
    //这儿依然能够输出内容
    printf("buffer content in parent next: %sn", buffer);
    return 0;
}

以下是输出:
buffer content in parent: parent
parent buffer address: 135655432

buffer content in child: child
child buffer address: 135655432

parent buffer address next: 135655432
buffer content in parent next: parent

|
你需要理解fork()的本质,
fork后创建的子进程是父进程的内存映像,所以地址应该就是完全一样的。
但是父子的内存地址空间又是不一样的,所以你对一个进程的内存操作并不会影响到另一个进程的内存空间,这里需要了解写时复制的概念.

    
 
 

您可能感兴趣的文章:

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












  • 相关文章推荐
  • fork与内存
  • fork 创建进程,共享内存,文件描述符问题
  • unix中的fork2与fork有设么区别?
  • 还是有关fork的问题,fork在一个函数中调用,我被搞胡涂了
  • fork()函数入门级问题:fork()与进程数
  • 一个fork的问题
  • 新手的问题关于fork?
  • 如何理解fork函数返回2次啊?
  • 急于明白Fork的用法.请提供中文解释.谢谢.
  • 关于fork的不解
  • 弱弱的问:fork和exec的区别是什么?
  • 关于fork的讨论
  • 关于fork的疑问?
  • fork之后的输出
  • exit和fork是什么关系?他们是怎么配合使用的?
  • fork函数,在线等待,马上结贴。谢谢!!!!!!!!!!!!
  • fork的问题
  • 请教 linux的fork从什么版本开始支持COW?
  • c++ 和 fork
  • 请教一个关于fork的问题。
  • "fork(2)" 中这个2表示什么意思
  • fork函数的源代码在哪呢


  • 站内导航:


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

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

    浙ICP备11055608号-3