Linux8 fork

目录

1、缓冲区

2、主函数参数

3、复制进程fork()

4、逻辑地址和物理地址

5、写时拷贝:

6、nm:显示自己定义过的符号

7、代码段从X0804 8000开始

8、数据段从x0804 9000开始

9、进程按照访问属性一致的地址空间存放在一起的原则,分为5个不同的内存区域


头文件unistd.h

1、缓冲区

缓冲区  内核-》屏幕

缓冲区满了   刷新缓冲区  

_exit,不刷新缓冲区直接退出,不会输出

exit先刷新缓冲区,再退出进程

2、主函数参数

argc:参数的个数

argv[]:参数内容//打印时,小于参数个数就继续打印

envg[]:环境变量//打印的时候!=NULL就继续打印

路径加名称是主函数的第一个参数

环境变量是从别的地方(父进程)继承过来的,我们只能传递前两个

例如:./main hello abc   //就是向主函数传递了两个参数,加上本身的第一个参数路径+名称,一共三个参数

由当前进程产生出来的进程是子进程,环境变量是由父进程继承来的

3、复制进程fork()

fork函数会产生一个新的进程,调用fork的进程为父进程,新生成的进程为子进程,在父进程中返回子进程的pid(唯一标识进程),在子进程中返回0,失败返回-1

父进程和子进程并发运行,一起执行,理论上会让子进程先执行

pid_t pid=fork();

复制进程,从父进程产生新的进程

getpid();//获取pid

fork()执行完之后,子进程才开始执行

4、逻辑地址和物理地址

对于复制的数据,逻辑地址相同,但是物理地址不同,看到打印的地址相同是因为打印的是逻辑地址

在程序中无法直接打印物理地址,也无法直接指定物理地址,因为不知道那一块内存为空

在同一个程序中,逻辑地址和物理地址是同一个地址

如果是两个进程,那么逻辑地址和物理地址不同,因为子进程是从父进程直接复制下来的,所以他们距离起始地址的偏移量是相同的,所以他们逻辑地址相同,打印出来的地址相同,但是实际上,他们占用的是不同的两块内存空间,物理地址不同

5、写时拷贝:

如果多个调用者请求同一份资源,当调用者对于资源不会进行更改时,会共同获取一个指针指向这份资源,直到调用者需要对这份资源进行改变时,才会复制一份资源给这个调用者

6、nm:显示自己定义过的符号

7、代码段从X0804 8000开始

8、数据段从x0804 9000开始

9、进程按照访问属性一致的地址空间存放在一起的原则,分为5个不同的内存区域

代码段:存放可执行文件的操作指令,可执行程序在内存中的镜像,只允许读取,是不可写的

数据段:用来存放可执行程序中已经初始化全局变量,就是放程序静态分配的变量和全局变量

bss段:包含了程序中未初始化的全局变量,在内存bss段全部置零

堆:用来存放进程运行中被动态分配的内存段,他的大小是不固定的,可动用函数分配内存时,新分配的内存就被添加到堆上,当使用函数释放内存时,被释放的内存从堆中剔除

栈:用户用来存放程序临时创建的局部变量,也就是函数中定义的变量,在函数调用时,函数的参数也会被被压入栈,等到调用结束,函数的返回值也被存放在栈中,我们可以把他看成一个寄存、交换临时数据的内存区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值