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

问题描述

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

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

int glob = 1;

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

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

printf("pid = %d, glob = %d, var = %dn", getpid(), glob, var);
//printf("glob_address: %pn", &glob);
//printf("var_address: %pn", &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,貌似子进程没有共享父进程的堆栈空间一样,这是为什么?求帮助解答........

时间: 2025-01-20 12:43:56

address-vfork函数与父进程共享空间问题的相关文章

linux fork函数与vfork函数

一.fork1. 调用方法#include <sys/types.h>#include <unistd.h> pid_t fork(void);正确返回:在父进程中返回子进程的进程号,在子进程中返回0错误返回:-1      子进程是父进程的一个拷贝.即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存:而对于只读的代码段,通常使用共享内存的方式访问.fork返回后,子进程和父进程都从调用fork函数返回处开始执行.     父进程与子进程的不同之处在于:fork的返

简述C语言中system()函数与vfork()函数的使用方法_C 语言

C语言system()函数:执行shell命令头文件: #include <stdlib.h> 定义函数: int system(const char * string); 函数说明:system()会调用fork()产生子进程, 由子进程来调用/bin/sh-c string 来执行参数string 字符串所代表的命令, 此命令执行完后随即返回原调用的进程. 在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT 和SIGQUIT 信号则会被忽略. 返回值: 1.如果 sy

Linux 用户进程内存空间详解

常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的. VIRT, Virtual Image (kb) RES, Resident size (kb) SHR, Shared Mem size (kb) %MEM, Memory usage(kb) SWAP, Swapped size (kb) CODE, Code size (kb) DATA, Data+Stack size (kb) nFLT, Page Fault count nDRT, Dir

linux c-关于与子进程与父进程

问题描述 关于与子进程与父进程 下面是我实验的一段代码,结果产生了,无限的输出.我的推测是子进程从f返回时,f的栈帧出栈,从而当子进程结束时.父进程由于f出栈从而又从新执行了main,从而产生无限输出.求教??????????? #include #include void f() { if(vfork()<0) { perror("fork"); } } int main(int argc,char * argv[]) { pid_t pid; pid=getpid(); pr

Linux内存点滴:用户进程内存空间

转载:http://blog.jobbole.com/45733/ 经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的.VIRT , Virtual Image (kb)RES, Resident size (kb)SHR, Shared Mem size (kb)%MEM, Memory usage(kb)SWAP, Swapped size (kb)CODE, Code size (kb)DATA, Data+Stack size (kb)nFLT

函数堆栈,共享库,打印出被调用函数【笔记】

函数堆栈,共享库,打印出被调用函数, 此文转自Linux man手册,仅做学习笔记使用 DL_ITERATE_PHDR(3) Linux Programmer's Manual DL_ITERATE_PHDR(3) NAME dl_iterate_phdr - walk through list of shared objects SYNOPSIS #define _GNU_SOURCE /* See feature_test_macros(7) */ #include <link.h> in

linux-fork函数父子进程读入输出问题

问题描述 fork函数父子进程读入输出问题 代码如下:int main(){ pid_t pid; int a; if((pid=fork())==-1) printf(""fork error""); printf(""%dbye!n""pid); scanf(""%d""&a); printf(""%d%d""apid); return

数据一旦共享 空间难以想象

上海广东等地开始数据统筹管理.增值开发等探索 数据一旦共享 空间难以想象 国务院<促进大数据发展行动纲要>提出了未来5到10年我国大数据发展和应用要实现的目标,包括2017年底前形成跨部门数据资源共享共用格局,2018年底前建成国家政府数据统一开放平台,率先在信用.交通.医疗.卫生等重要领域实现公共数据资源合理适度向社会开放. 当前,上海.广东等地开始开放部分公共数据.增设新的政府部门,探索开展大数据增值性.公益性开发和创新应用. 试水数据开放,带来更多可能 去年8月起,由上海市经济信息化委员

C++进程共享数据封装成类实例_C 语言

本文实例讲述了C++进程共享数据封装成类的方法,分享给大家供大家参考.具体方法如下: ShareMemory.cpp源文件如下: 复制代码 代码如下: #include "ShareMemory.h"    CShareMemory::CShareMemory(const    char* pszMapName, int nFileSize, BOOL bServer):m_hFileMap(NULL),m_pBuffer(NULL)  {      if (bServer) //是服