免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3860 | 回复: 17
打印 上一主题 下一主题

[C] malloc与fork问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-29 11:16 |只看该作者 |倒序浏览
1.代码
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

main()
{
    char *ptr;
    pid_t child;

    ptr=(char *)malloc(20);

    child=fork() ;
    if ( child<0 ) {
        perror("fork err");
        exit(-1);
    } else if ( child==0 ) {
        sleep(1);
        printf("%d,%p,[%s]\n",getpid(),ptr,ptr);
        exit(0);
    } else {
        strcpy(ptr,"hello");
        printf("%d,%p,[%s]\n",getpid(),ptr,ptr);
        wait(NULL);
        exit(0);
    }
}

执行结果是:
2200,403b44,[hello]
2201,403b44,[]
以前听说子进程如果不改变ptr的值,那么就不重新分配空间,地址是没有变化,可为什么取不到值,是不是403b44是内存相对地址?

2.还想问个问题,一个函数,fork之后子进程malloc,然后exit退出子进程,再return退出函数,之间没有free会不会内存泄露?

论坛徽章:
0
2 [报告]
发表于 2008-05-29 11:19 |只看该作者
进程间资源相互独立,比如内存。只是某些变量的值一样(没有认为改变的前提下,保持fork前状态)
比如:
一个int变量的内容
一个指针变量的内容

论坛徽章:
0
3 [报告]
发表于 2008-05-29 11:28 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2008-05-29 11:45 |只看该作者
感觉上应该是已经指向不同地址了,要那么容易就共享内存,还要IPC干什么? 呵呵
解释一下用%p打印的ptr地址的意义?

另,请哪位大侠说下第二个问题。

论坛徽章:
0
5 [报告]
发表于 2008-05-29 11:46 |只看该作者
1、403b44是虚地址

2、自己malloc的自己free,和进程没关系。分配了没free就肯定泄漏。而且,你不能把子进程分配的内存在父进程free

参考2楼

论坛徽章:
0
6 [报告]
发表于 2008-05-29 11:49 |只看该作者
我觉得你是没搞清物理地址和虚地址的概念

论坛徽章:
0
7 [报告]
发表于 2008-05-29 11:54 |只看该作者
退出进程会自动free吧

论坛徽章:
0
8 [报告]
发表于 2008-05-29 12:03 |只看该作者
原帖由 weedeater 于 2008-5-29 11:46 发表
1、403b44是虚地址

2、自己malloc的自己free,和进程没关系。分配了没free就肯定泄漏。而且,你不能把子进程分配的内存在父进程free

参考2楼


1、能否说明一下虚地址?

2、我的程序不是长期运行,退出后OS是不是会自己回收内存?
   我没有在父进程中free子进程空间的打算,你理解错我的意思了。我的意思是这样:

int function()
{
      child=fork();
      if (child==0) {
            malloc(...);
            execl(...);
      }

      wait(status);
      
      return(status)
}
因为执行完execl后程序就exit退出了,所以没有free。

论坛徽章:
0
9 [报告]
发表于 2008-05-29 12:21 |只看该作者
*nix系统是有个写时复制的机制,是说父子进程任何一方修改共享的内容时,都会导致系统复制修改部分的页面给该进程,并不是你说的仅仅是子进程修改内容才会导致复制的发生。

论坛徽章:
0
10 [报告]
发表于 2008-05-29 12:35 |只看该作者
虽然进程退出后OS会自动回收内存,可这不是我们偷懒的接口,
万一谁把那段程序copy到长期运行的服务器程序去呢,
程序退出后打开的文件描述符都会close,
那是否我们就只管open, 不去close呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP