2 u012796139 u012796139 于 2014.12.07 10:05 提问

vfork函数与父进程共享空间问题

//测试程序
#include "apue.h"

int glob = 1;

int main(void)
{
int var = 1;
int pid;

printf("before fork\n");
if((pid = vfork()) < 0)
{
    perror("fork error");
    exit(-1);
}
else if(pid == 0)
{
    glob++;
    var++;
    printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
    //printf("glob_address: %p\n", &glob);
    //printf("var_address: %p\n", &var);
    _exit(0);
}

printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
//printf("glob_address: %p\n", &glob);
//printf("var_address: %p\n", &var);

return 0;

}
1 此时没有让程序输入var和glob变量的地址,运行结果为
before fork
pid = 15865, glob = 2, var = 2
pid = 15864, glob = 2, var = 1
2 取消掉注释后,运行结果为
before fork
pid = 25515, glob = 2, var = 2
glob_address: 0x804a050
var_address: 0xbfa4d4cc
pid = 25514, glob = 2, var = 2
glob_address: 0x804a050
var_address: 0xbfa4d4cc

问题:(程序在codeblocks10.05中运行的,ubuntu12.04系统)
vfork创建一个进程后,在子进程调用exec或exit之前,它在父进程中执行,运行结果2也说明了这一点,var和glob的都被子进程给加1了,但是运行结果1的父进程var变并没有加1,貌似子进程没有共享父进程的堆栈空间一样,这是为什么?求帮助解答........

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
子进程不会完全复制父进程的地址空间,它会在父进程的地址空间中运行
vfork创建的子进程与父进程地址空间关系 存储unix编程 在《UNIX环境高级编程》一书的第八章中,有一道课后习题如下: 回忆图7-3典型的存储空间布局。由于对应于每个函数调用的栈帧通常存储在栈中,并在调用 vfork后,子进程运行在父进程的地址空间中,如果不是在main函数中而是在另一个函数中调用vfork,以后子进程从该函数返回时,将会发生什么情况? 作者Rich
vfork创建的子进程与父进程地址空间关系
在《UNIX环境高级编程》一书的第八章中,有一道课后习题如下:回忆图7-3典型的存储空间布局。由于对应于每个函数调用的栈帧通常存储在栈中,并在调用 vfork后,子进程运行在父进程的地址空间中,如果不是在main函数中而是在另一个函数中调用vfork,以后子进程从该函数返回时,将会发生什么情况?作者Rich Stevens是一位大师,留下这么一题必有其深意,于是结合《深入理解计算机系统》中
vfork函数创建出的父子进程
vfork函数创建新进程的主要目的在于用exec函数执行另外的程序。在没调用exec或exit之前子进程的运行中是与父进程共享数据段的,在vfork调用中,子进程先运行,父进程挂起,直到子进程调用exec或exit,在这之后,父子进程的执行顺序不在有限制。 例:   1 #include   2 #include   3 #include   4 #include   5    6
fork函数与vfork函数的差别
fork函数 头文件:#include&amp;lt;unistd.h&amp;gt; 函数原型:pid_t fork(void) 功能:它是从已经存在的进程中创建一个新进程, 新进程为子进程,而原来的进程为父进程 1.fork函数的返回值情况 ps:子进程返回0,父进程返回子进程的pid。 2.父进程与子进程之间的关系 (1)子进程是以父进程为模板的,数据结构一样; (2)代...
Linux系统编程——vfork() 函数详解
1)fork(): 父子进程的执行次序不确定。 vfork():保证子进程先运行,在它调用 exec(进程替换) 或 exit(退出进程)之后父进程才可能被调度运行。 2)fork(): 子进程拷贝父进程的地址空间,子进程是父进程的一个复制品。 vfork():子进程共享父进程的地址空间(准确来说,在调用 exec(进程替换) 或 exit(退出进程) 之前与父进程数据是共享的)
vfork()子进程return 0对父进程的变量的影响
vfork()会产生一个新的子进程.但是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
linux 进程创建clone、fork与vfork
首先说明Linux下的进程与线程比较相近。这么说的一个原因是它们都需要相同的数据结构来表示,即task_struct。区别在于一个有独立的用户空间,一个是共享的用户空间(如果完全没有用户空间则是内核线程,不需要)。     Linux的用户进程不能直接被创建出来,因为不存在这样的API。它只能从某个进程中复制出来,再通过exec这样的API来切换到实际想要运行的程序文件。     复制的API
linux---谈谈vfork和fork的区别及exit与return
fork():创建子进程的函数,是大家比较熟悉的吧。pid_t id = fork(); 这里的vfork();也是创建子进程的函数。现在我们来剖析一下它们吧。 第一例: 先看一个fork()的例子哦。 对于fork()而言,创建子进程成功后直接打印出父子进程执行的两条语句。即: 这里要特别强调的是:父子进程的调度的顺序是由调度器决定的。 再看看vfork()函
fork与vfork的使用和区别
fork和vfork()函数都可以创建一个新的进程。主要的两个区别如下: 1.vfork()函数在创建子进程时,不会复制父进程的所有资源,相反,子进程共享父进程的内存,直至其成功执行了exec()或者调用_exit()    退出。 2.vfork()函数创建的子进程最后必须调用_exit()函数才能正确退出子进程,不能使用exit()函数。 为了更便于理解fork()和vfork()两个
fork vfork 父进程和子进程的内存关系
fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。于是起初我就感到奇怪,子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢?!原来在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都