来看代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int val = 50;
int main()
{
printf("father process is running,pid is:%d,ppid is:%d,val:%d,&val:%p\n", getpid(), getppid(), val, &val);
pid_t id = fork();
if (id == 0)
{
int cnt = 0;
while (1)
{
printf("child process,val:%d,&val:%p\n", val, &val);
cnt++;
sleep(1);
if (cnt == 3)
{
val = 100;
printf("child proess change 50->100\n");
printf("child process,val:%d,&val:%p\n", val, &val);
sleep(1);
}
}
}
else if (id > 0)
{
while (1)
{
printf("father process,val:%d,&val:%p\n", val, &val);
sleep(1);
}
}
return 0;
}
能不能在创建子进程的时候就将父进程的数据全部写时拷贝呢?
- 可以,但是没必要,因为子进程不一定会全部修改父进程的数据,写时拷贝是有一定的消耗的,应该要按需分配,修改的时候在写时拷贝,这样更能节省消耗!
②这也解释了fork函数,同一个id变量名为什么既能>0,又能小于0的原因。因为fork函数会返回两次,即return,return的本质就是写入(修改),发生写时拷贝!
//fork会return,对父进程的id写入,发生写时拷贝!
pid_t id=fork();
if(id==0)
{
//child
....
}
else if(id>0)
{
//father
.....
}
就好像一把直尺,每一部分的内容都有属于自己的范围!
①拦截非法请求,变相保护物理内存!
②进程管理模块和内存模块的解耦,实际是提高内存利用率。
③将无序变有序,让进程以统一的视角看待物理内存以及自己运行的各个区域。
好了,今天的内容就分享到这里,如果你有所收获,欢迎三连,xd!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务