QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 730|回复: 1

小小菜鸟,弱弱的问下

[复制链接]
发表于 2005-10-31 11:23:31 | 显示全部楼层 |阅读模式
初学linux
一段简单的代码,在linux下c程序
#include <sys/types.h>
int glob=6;
int
main(void)
{
int var;
pid_t pid;
var=88;
printf("before vfork\n");
if( (pid=vfork())<0)
{
printf("vfork error\n");
exit(1);
}

else if(pid ==0){
glob++;
var++;
exit(0);
}
printf("pid =% d,glob= %d var =%d\n",getpid(),glob,var);
exit(0);
}

此时结果正常
befork vfork
pid=2443,glob=7,var=89

如果把红色大字的exit(0)改成return 0的话
结果var是个不确定的值
before vfork
pid=2443,glob=7,var=1107472635
请问一下,为什么?这两个函数原来上有什么区别呢?
谢了
发表于 2005-11-1 10:16:45 | 显示全部楼层
vfork系统调用:由于在使用fork时,内核会将父进程拷贝一份给子进程,但是这样的做法相当浪费时间,因为大多数的情形都是程序在调用fork后就立即调用exec,这样刚拷贝来的进程区域又立即被新的数据覆盖掉。因此 Linux系统提供一个系统调用vfork,vfork假定系统在调用完成vfork后会马上执行exec,因此vfork不拷贝父进程的页面,只是初始化私有的数据结构与准备足够的分页表。这样实际在vfork调用完成后父子进程事实上共享同一块存储器(在子进程调用exec或是exit之前),因此子进程可以更改父进程的数据及堆栈信息,因此vfork系统调用完成后,父进程进入睡眠,直到子进程执行exec。当子进程执行exec时,由于exec要使用被执行程序的数据,代码覆盖子进程的存储区域,这样将产生写保护错误(do_wp_page)(这个时候子进程写的实际上是父进程的存储区域),这个错误导致内核为子进程重新分配存储空间。当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。

网上找的,不过我也是不太明白。
猜想:难道是因为return会把资源释放掉?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 04:12 , Processed in 0.078847 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表