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

程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存

    来源: 互联网  发布时间:2015-05-12

    本文导语:  程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存? | fork会把进程的上下文都复制一遍,如果是malloc申请的话,内核会在给子进程分配和父进程一样多的得空间...

程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存?

|
fork会把进程的上下文都复制一遍,如果是malloc申请的话,内核会在给子进程分配和父进程一样多的得空间,父子进程都需要分别free,(mmap除外)

|
在子进程中只能释放子进程从父进程复制过来的内存副本,不能释放父进程自己申请的内存。只能在父进程显式的释放

|
好像进程的上下文都复制一遍,只是指针引用数的递增,不涉及自由存储区复制.
如此看来,应该不需要

|
fork后父子完全一样,都需要用free释放。mmap的也需要munmap。

|
现在很多的实现并不做一个父进程数据段和堆的完全拷贝,因为在fork之后经常跟随着exec。作为替代,使用了在写时复制( Copy-On-Write,COW)的技术。这些区域由父、子进程共享,而且内核将它们的存取许可权改变为只读的。如果有进程试图修改这些区域,则内核为有关部分,典型的是虚存系统中的“页”,做一个拷贝。

|
有些实现是这样,不过对程序员没有帮助,因为逻辑上fork仍然是copy。如果需要exec,建议用vfork。

|
??要释放。除非exec或exit。

|
必须要释放,子进程和父进程的那段内存已经不是一块内存了!

|
你可以这样试
char *ptr = malloc(128);
pid_t child;
int stat;  //waitid(pid, *stat, intval) 原型

ptr[0] = 'A';
if(0 == (child = fork())) {
  memset(ptr, '', 128);
  free(ptr);
  ptr = NULL;
  exit();
}
else {
  wait(child, &stat,0);
  if(0 == WIFEXITSTATUS(stat)) { //子进程 end
    if('A' == ptr[0]) // 父子进程指向不同存储区
       free(ptr);
    }
  }
  ....
  //父子进程指向相同存储区,没必要free
    
  

|
我觉得 子进程 是对父进程的拷贝, 子进程free的是自己的那块内存(当然其中有
写时拷贝的技术,但它是透明的)

    
 
 

您可能感兴趣的文章:

  • 如何解决程序自己调用自已后结束进程,并且父进程能真的退出不成为僵尸进程?
  • 在程序中启动一个进程(不是线程),如何知道该进程已运行结束
  • 通过c程序写代码怎么查看进程是不是存在了?怎么查看该进程占用的内存是多少?
  • 应用程序chinput开机自动启动, 但状态为Defunct的进程(“僵尸”进程), 如何删除?
  • 奇怪:程序一fork子进程时就停住了,似乎根本不能fork子进程啊?
  • shell进程退出,其子进程怎样才能不死,交给init进程管,谢谢,请指点下我写的程序
  • 如何在程序中执行另外一个程序,并且当前进程依然执行?
  • 为什么我在java程序里启动的一个程序在java程序关闭后,该程序的所有进程都关掉了
  • 这个socket程序的服务进程开始服务后,为什么总是两个进程?
  • 怎样编写一段程序,要求调用fork并在子进程中建立一个新的对话期。验证子进程变成了进程组长而且不再有控制终端。
  • 为什么这个程序没有输出?父进程中止后子进程也跟着中止吗?
  • 先 fork 子进程然后 execl 另一个可执行程序, 如何得到这个可执行程序结束的返回值?
  • linux shell关掉后java程序(进程名abc)仍能运行,用ps -ef|grep abc能查到进程名
  • 在程序中如何得到一个进程的状态?(不用ps命令),如何检查一个进程处于D状态(uninterruptible sleep)
  • 如何准确理解“程序”、“进程”、“线程”这三个概念
  • 请问在 linux 下如何使用 execl() 调用另一个多进程的程序?
  • 请问gdb怎么处理带有启动参数的程序和多进程程序?
  • 为什么程序异常后,这个程序监听的端口被转移到其它进程里
  • 关于sco下的多进程程序的问题?
  • help help busy!!! 知道进程的ID号,在程序里如何检查这个进程还在不在?
  • c/c++服务器程序内存泄露问题分析及解决
  • 请教!Linux系统C开发的程序,为什么我的程序运行时内存持续增长,程序退出后内存也没有降低?
  • C++程序的内存不同的数据段及堆栈布局
  • 程序需要共享内存相当大,但是系统的内存有限
  • 遇到奇怪的内存泄露问题,应用程序杀死内存无法释放!
  • 常驻内存程序就是后台程序吗?
  • 程序运行20分钟狂泻1G内存,当系统只剩5、6M内存时程序依然运行稳定(未使用交换分区),点解?
  • Linux下的程序是在内存中运行的吗?为什么在程序运行的时候可以删除程序文件?
  • CGI程序无法访问本机某个程序创建的共享内存〔求教〕
  • 在Linux上用C语言作了一个程序,程序中申请(malloc)了很大的内存,但是没free,当程序运行结束后,内存是否自动释放?
  • 请问能否在linux实现一个应用程序访问另外一个程序的内存数据?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux 应用程序中怎么申请到连续的物理空间
  • 用户程序下如何申请到一段在物理地址上是连续的空间。
  • 诚:申请<Linux/Unix社区 内核及驱动程序研究区>小版版主
  • 如何释放异常终止程序申请的共享内存空间
  • 申请Linux/Unix社区大论坛下程序开发区小论坛的版主
  • 申请"Linux/Unix社区的内核及驱动程序研究区"小斑竹,请大家支持,谢谢。
  • 申请Linux/Unix社区 程序开发区 版主
  • 重装服务器后IIS网站错误(应用程序中的服务器错误)
  • Linux 编程怎么样在程序开启一个程序,和关闭一个程序?
  • windows server2008上PowerBuilder程序系统错误解决方法
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 我的程序是用c写的gtk+程序,有个函数的参数要传给它图片的文件名,但是图片和原程序不在同一目录下怎么办?怎么在程序里指定文件的路径
  • 程序员的八种级别,你属于哪一级?
  • 为什么linux下的C++程序这么少见? 请问那里有linux下的C++程序?什么类型的程序都可以.
  • Linux下指定运行时加载动态库路径及shell下执行程序默认路径
  • 我写了个linux下的网络程序,程序在多个电脑间通信,但是我没有多个电脑,怎么调试这样的程序啊?
  • 在docker容器中通过apt-get安装新的程序
  • 在java控制台程序中,可以用System.exit(0);使用一个程序终止,那么在servlet中如何使一个servlet程序终止呢?
  • linux下通过crond实现自动执行程序
  • 程序调用脚本,脚本启动另一个程序,如何让原始程序彻底释放资源?
  • http协议介绍,文件上传分析及程序举例
  • python计算程序开始到程序结束的运行时间和程序运行的CPU时间
  • 程序员赚钱致富的6种方法
  • linux下,一个程序如何向另一个程序发送消息,另一个程序如何接收
  • HASH查找的程序实现及性能分析
  • jsp程序运行一次后,再修改原jsp程序,为什么运行还是的还是原来的程序??
  • 程序员为了健康必看!早晨空腹喝水,是对还是错?
  • 从定时从A程序调用B程序(B程序运行一下就退出)多次后,出现僵尸进程?如何解决?


  • 站内导航:


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

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

    程序运行20分钟狂泻1G内存,当系统只剩5、6M内存时程序依然运行稳定(未使用交换分区),点解? iis7站长之家