vfork创建子进程,子进程退出后释放内存空间

zhuxinquan61 2015-07-27 10:08:06
在使用vfork创建了一个子进程之后,本来预想子进程与父进程共享同一块内存空间,包括局部变量以及全局变量,不过在测试时,发现当子进程退出后,父进程的局部变量的空间被释放了,得到了一个随即数,我想确定一下,是不是当子进程退出时会释放掉公用的内存空间,为什么全局变量的内存空间不释放?
测试代码如下:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>

int globvar = 5;

int main(void)
{
pid_t pid;
int var = 1, i;

printf("fork is diffirent with vfork\n");

pid = vfork();
switch(pid)
{
case 0:
i = 3;
while(i-- > 0)
{
printf("child process is run\n");
globvar++;
var++;
printf("child var = %d\n", var);
sleep(1);
}
printf("child globvar = %d, var = %d\n", globvar, var);
break;

case -1:
perror("parent process failed\n");
exit(0);

default:
i = 5;
while(i-- > 0)
{
printf("parent process is running\n");
globvar++;
var++;
printf(" parent var = %d\n", var);
sleep(1);
}
printf("parent's globvar = %d, var = %d\n", globvar, var);
exit(0);
}
}

...全文
267 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuxinquan61 2015-07-31
  • 打赏
  • 举报
回复
昨天才知道了真正的原因,当case0结束后使用的是break,最后没有执行任何语句,则最后退出时默认使用return来退出,而return相当于一个函数的退出,一个函数的退出会释放局部变量,也就是栈内存中的变量,所以会产生这样的结果,而如果在最后使用exit退出则不会释放栈内存,大概就这样,关于进程的退出,可以看我的博客 blog.csdn.net/zhuxinquan61/article/details/47143313
mymtom 2015-07-28
  • 打赏
  • 举报
回复
楼主做些尝试了解vfork是可以的,但是vfork只应该调用exec族函数和_exit, 而且不能修改任何变量(接收vfork返回值的变量除外),否则结果是不确定的。 NAME vfork - create new process; share virtual memory SYNOPSIS #include <unistd.h> pid_t vfork(void); DESCRIPTION The vfork() function has the same effect as fork(), except that the behaviour is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit() or one of the exec family of functions.
飞翔的薄荷 2015-07-27
  • 打赏
  • 举报
回复
百度百科的解释: 子进程在vfork()返回后直接运行在父进程的栈空间,并使用父进程的内存和数据。这意味着子进程可能破坏父进程的数据结构或栈,造成失败。 为了避免这些问题,需要确保一旦调用vfork(),子进程就不从当前的栈框架中返回,并且如果子进程改变了父进程的数据结构就不能调用exit函数。子进程还必须避免改变全局数据结构或全局变量中的任何信息,因为这些改变都有可能使父进程不能继续。
zhuxinquan61 2015-07-27
  • 打赏
  • 举报
回复
最后我又做了尝试,因为子进程是在break;之后退出的,算作是非正常退出,在其后添加exit(0)之后就不会出现这种随机数了,也就是说,虽然子进程同样会改变父进程使用的变量的值,但是随机数的出现并非是内存释放,而是异常退出导致子进程的数据不正常,也就顺带导致了父进程内存区域的值的改变

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧