父子进程内存问题

/*我们知道一个程序有代码段、数据段和堆栈段,代码段被父子进程贡献,那么数据段和堆栈段呢?我们来看下面的程序:*/

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
static int count = 0;
int main(int argc , char **argv)
{
int id;

id=fork();
if(id<0)
{
printf("fork error\n");
}
else if(id==0)
{
count++;
printf("I‘m in child process\n");
printf("child count=%d\n",count);
}
else
{
count++;
printf("I‘m in parent process\n");
printf("parent count=%d\n",count);
}

return 0;
}

/*结果是:
I‘m in child process
child count=1
I‘m in parent process
parent count=1
很显然,如果数据段是共享的话,那么两次打印的count的值肯定有一个为2,现在都是1就说明数据段是独立的,同样其实堆栈段也是独立的!fork()函数会将父进程的数据段和代码段拷贝过来,作为子进程独立的数据段和代码段!*/

时间: 2024-10-27 10:44:26

父子进程内存问题的相关文章

父子进程共享内存通信的三种方法

1.  mmap MAP_ANONYMOUS 在支持MAP_ANONYMOUS的系统上,直接用匿名共享内存即可, 2. mmap  /dev/zero 有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果. 3. shmget shmat shmctl shmget 是老式的system V 共享内存模式,很多系统都支持这种方法. 父子进程共享内存通信的三种方法

父子进程

fork 后子进程对父进程的继承 (1)为什么需要创建子进程? 每一个程序的运行都需要进程,创建子进程可以实现宏观上的并行 (2)什么时候需要创建子进程? 当父进程执行到某个阶段,或接收到某个事件后,需要创建一个独立的进程来协助其完成任务时,才需要调用fork创建一个新进程 (3)子进程对父进程的继承 1.为什么要继承父进程的相关资源,参考  http://blog.csdn.net/xlsernt_sina_com/article/details/31350829 摘选了两句话: 父进程创建子

堆栈和父子进程的概念

栈帧:堆栈是C语言程序运行时必须的一个记录调用路径和参数的空间 函数调用框架.传递参数.保存返回地址.提供局部变量空间. 堆和栈的关系: 堆栈一般指的是栈:实际上堆和栈是不同的. 堆需要用户在程序中显性申请,空间由用户维护,释放空间不当会导致内存泄漏:但是栈不用,由系统自动完成. 堆的空间比较大,栈比较小. 栈的生命周期短,随着函数退出和返回消亡:堆的生命周期可以是整个程序执行完成退出,但是一般用户都会在使用时申请空间,不用时释放空间,防止空间消耗完毕. 在fork之后处理的文件描述符有两种常见

fork()函数 —— 父子进程资源问

fork()函数功能--创建新进程 1.父子进程有独立的数据段.堆.栈,共享代码段 Linux中每个进程都有4G的虚拟地址空间(独立的3G用户空间和共享的1G内核空间),fork()创建的子进程也不例外.子进程资源的由来: 1.1G内核空间既然是所有进程共享,因此fork()创建的子进程自然也将拥有: 2.3G的用户空间是从父进程进程而来. fork()创建子进程时继承了父进程的数据段.代码段.栈段.堆,注意从父进程继承来的是虚拟地址空间,同时也复制了页表(没有复制物理块).因此,此时父子进程拥

浅谈父子进程

通过Linux启动过程可以得知,所有进程都是init进程直接或者间接的fork出来的. 首先咱们来看看怎么创建子进程: 头文件 #include <unistd.h> int fork(void); //创建一个子进程(开辟和父进程相同空间)返回值:-1失败,成功返回创建的子进程的Id int vfork(void); //创建一个子进程(共享父进程资源空间)返回值:-1失败,成功返回创建的子进程的Id int pid = fork(); int c = 0; if(pid == 0){  

C/C++ 父子进程之间的文件描述符问题

在C程序中,文件由文件指针或者文件描述符表示.ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UNIX的I/O函数(open, close, read, write, ioctl)使用文件描述符.下面重点来说下,文件描述符是如何工作的. 文件描述符相当于一个逻辑句柄,而open,close等函数则是将文件或者物理设备与句柄相关联.句柄是一个整数,可以理解为进程特定的文件描述符表的 索引.先介绍下面三个概念,

父子进程共享的东西

自父进程继承 进程的资格(真实(real)/有效(effective)/已保存(saved) 用户号(UIDs)和组号(GIDs)) 环境(environment) 堆栈 内存 打开文件的描述符(注意对应的文件的位置也是和文件一起由父子进程共享的) 执行时关闭(close-on-exec) 标志 (译者注:close-on-exec标志可通过fnctl()对文件描 述符设置,POSIX.1要求所有目录流都必须在exec函数调用时关闭.更详细说明, 参见<UNIX环境高级编程> W. R. St

[学习笔记]父子进程共享文件描述符理解

#include<stdio.h> #include<stdlib.h> #include<string.h> #include <unistd.h> #include<errno.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> //演示父子进程共享文件描述符 //相当于2个

父子进程共享资源的关系

fork() 用来创建进程fork(void) 在linux中所有进程都是由init进程直接或间接创建 成功:在父进程中将返回子进程的PID:子进程返回0,以区别父进程 失败:父进程中返回-1 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 5 int main(int argc,char *argv[]) 6 { 7 pid_t pid; 8 if((pid=fork())==