Linux进程-fork创建新进程之内存区域分析
2014-07-11 21:20
357 查看
写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!
如果发现一些笔记的说法完全是错误的请建议我删除!
通过fork创建的子进程克隆父进程的内存区域(全局区、栈区、堆区、代码区),但内存区域通过映射之后指向不同的物理空间,所以,尽管子进程克隆了父进程的内存区域,但他们的实际内存是独立. 不能相互访问.
问题:
1.父子进程如何访问内存资源和文件资源呢?
2.进程之间如何交换数据?(进程之间的通信是多进程程序的重点,后面专门罗列进程之间的通信方式)
如下代码说明子进程是如何克隆父进程的内存区域的
结果如下:
通过上面的结果思考一些问题……
如果发现一些笔记的说法完全是错误的请建议我删除!
通过fork创建的子进程克隆父进程的内存区域(全局区、栈区、堆区、代码区),但内存区域通过映射之后指向不同的物理空间,所以,尽管子进程克隆了父进程的内存区域,但他们的实际内存是独立. 不能相互访问.
问题:
1.父子进程如何访问内存资源和文件资源呢?
2.进程之间如何交换数据?(进程之间的通信是多进程程序的重点,后面专门罗列进程之间的通信方式)
如下代码说明子进程是如何克隆父进程的内存区域的
</pre><div><pre name="code" class="cpp">#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<sys/wait.h> #include<signal.h> #include<sys/mman.h> int ga = 1; int main() { int a = 10; int *pa = static_cast<int*>(malloc(sizeof(int))); *pa = 100; int *ma = static_cast<int*>( mmap(0,4,PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED/*MAP_PRIVATE*/,0,0) ); *ma = 1000; int *spa = static_cast<int*>( sbrk(4) ); *spa = 10000; if(fork()) { printf("parent:ga = %d\n",ga); printf("parent:a = %d\n",a); printf("parent:*pa = %d\n",*pa); printf("parent:*ma = %d\n",*ma); printf("parent:*spa = %d\n",*spa); a = 8; ga = 88; *pa = 888; *ma = 8888; *spa = 88888; } else { sleep(5); printf("\nchild:ga = %d\n",ga); printf("child:a = %d\n",a); printf("child:*pa = %d\n",*pa); printf("child:*ma = %d\n",*ma); printf("child:*spa = %d\n",*spa); } return 0; }
结果如下:
通过上面的结果思考一些问题……
相关文章推荐
- Linux下进程创建Fork()函数分析
- Linux进程-fork创建新进程之文件分析
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
- Linux进程的管理与调度(八) -- Linux下进程的创建过程分析(_do_fork/do_fork详解)
- Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度(八)【转】
- 通过fork函数创建进程的跟踪,分析linux内核进程的创建
- Linux创建进程fork和vfork函数分析
- Linux下进程的创建过程分析(_do_fork/do_fork详解)--Linux进程的管理与调度(八)
- Linux\Unix IPC进程通信实例分析(一):共享内存通信---文件映射mmap方式
- Linux基础学习系列:对于fork()函数的学习,及进程创建相关知识
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- linux 任务调度,进程创建(fork)(2.6内核)
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- Linux0.11版源代码分析——init/main.c(进程0及fork)
- linux中fork创建进程讲解
- linux中fork同时创建多个子进程的方法(二)
- Linux0.11内核--fork()函数创建进程
- Linux0.11进程创建函数fork()