当前位置: 技术问答>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
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的是自己的那块内存(当然其中有
写时拷贝的技术,但它是透明的)
写时拷贝的技术,但它是透明的)