开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:父子进程有自己独立的地址空间】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/10986
父子进程有自己独立的地址空间
内容简介:
一、内容
二、举例子进行说明
一、内容
接下来去验证父子进程分别有各自独立的地址空间,之前提到父进程创建子进程之后,
先看下图:
可以看到上图中父进程有自己的栈区、堆区、 BSS 区、数据区、代码区,子进程也有自己的栈区、堆区、 BSS 区、数据区、代码区,子进程是复制了父进程的内存,进程空间是独立的,也就是说如果父进程有 number ,那么子进程也继承了 number ,但是父进程的 number 是父进程的,子进程的 number 是子进程的,父进程对父进程的 number 进行改变是不会影响子进程的 number 。
二、举例子进行说明
1、输入代码
接下来举一个例子验证父子进程有各自独立的地址空间,
例子如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int var=10
int main(int argc, char *argv[])
{
pid_t pid;
int num=9;
pid=fork();
if(pid<0)
{
perror(“fork”);
}
if(pid==0)
{
var++;
num++;
printf(“in son process var=%d,num=%d\n”,var,num);
}
printf(“common code area\n”);
return 0;
}
在这个程序当中定义一个全局变量 var 等于10,局部变量 number等于9,,有个全局有个局部,然后在第九行的时候, folk 创建子进程,子进程当中就有 var 、就有 number ,在子进程当中它干了什么事?“var++ num++”,其中 var 打11, num 打10,这是加之后的;父进程它干什么事?先 sleep(1),它 sleep(1)时子进程就已经执行完了“var++;
num++;
Printf(“in son process var=%d,num=%d\n”,var,num);”
代码,然后再执行“printf(“common code area\n”);”代码,子进程就结束了。
一秒钟之后,父进程再去打印 var 和 num ,如果说它是共享 var 和 num ,那么父进程的 var 和 num 是11和10,如果说打的是十和九,证明子进程对 var 和 num 进行加的时候没有影响父进程的 var 和 num ,即它们是独立的。
2、代码实现
(1)执行代码
看一下是共有 var 和 num ,还是独立的拥有 var 和 num ,父进程一秒钟之后打 var 和 num ,然后再打公共代码,就结束了,如下代码所示:
[01_day]1s
aaa.txt fork fork.c my_cp.c pid.c read.c test.txt
dest.txt fork2.c my_cp pid read tags wanqi.txt
[01_day]gcc fork2.c -o fork2
[01_day]./fork2
in son process var=11,num=10
common code area
in father process var=10,num=9
common code area
可以看到子进程当中 var 是十一, num 是十,一秒钟之后父进程再去打的话还是十和九,就没加过,因为它是后来打印的,子进程早都加过了,它还没变,说明父进程有自己的 var 和 num ,子进程也有自己的 var 和 num 。
(2)再次执行代码
即使再执行一遍子进程的一秒钟之后父进程的还是十和九,验证了父子进程有自己独立的地址空间,
代码如下所示:
[01_day]./fork2
in son process var=11,num=10
common code area
in father process var=10,num=9
common code area