对于fork()的一些总结
程序员文章站
2024-02-16 13:04:10
...
实现fork复制进程:
流程图:
源程序:
执行结果:
fork分析:
测试结果:
运行结果中,parent的pid 3973小于child的pid 3974,结论:父进程的pid比子进程的pid先出现,为什么父进程和子进程的&n一样而n不一样?因为&n是逻辑地址,不是内存中的地址,这也是n的值不一样的原因。(逻辑地址相同,物理地址不一定相同)进程中打印的是逻辑地址,不是物理地址。
在进程中用malloc申请空间使用完后,没有free,不会产生内存泄漏(申请1G能否成功,考虑:虚拟内存?)?
因为在进程执行完后,OS会将分给进程的空间资源收回。
写时拷贝?
内核只为新生成的子进程创建虚拟空间结构,它们来复制于父进程的虚拟究竟结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。
未完待续。。。
有关fork()的一些笔试题:
1、伪代码:
int main()
{
fork() || fork();//fork() && fork();同理
printf("a\n");
exit(0);
}
测试结果:
a
a
a
分析:
2、
int main()
{
int i = 0;
for(;i<2;++i)
{
fork();
printf("a\n");//\n每次都要冲刷缓冲区
exit(0);
}
}
测试结果:
a
a
a
a
a
a
分析:
printf(“a\n”);以\n结束每次循环都要强制冲刷缓冲区。
3、重点内容
int main()
{
int i = 0;
for(;i<2;++i)
{
fork();
printf("a");
}
exit(0);
}
测试结果:
aaaaaaaa
分析:
没有以\n结束,不具备每次强制冲刷到缓冲区的能力,在第一次fork()时,会将父进程没有冲刷到缓冲区的a一起复制(fork())给子进程,最后等到程序运行完后一起打印出来。
下一篇: 微信小程序使用iconfont图标