欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对于fork()的一些总结

程序员文章站 2024-02-16 13:04:10
...

实现fork复制进程:
流程图:
对于fork()的一些总结
源程序:
对于fork()的一些总结
执行结果:
对于fork()的一些总结
fork分析:
对于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
分析:
对于fork()的一些总结
2、

int main()
{
    int i = 0;
    for(;i<2;++i)
    {
        fork();
        printf("a\n");//\n每次都要冲刷缓冲区
        exit(0);
    }
}

测试结果:
a
a
a
a
a
a
分析:
对于fork()的一些总结
printf(“a\n”);以\n结束每次循环都要强制冲刷缓冲区。
3、重点内容

int main()
{
    int i = 0;
    for(;i<2;++i)
    {
        fork();
        printf("a");
    }
    exit(0);
}

测试结果:
aaaaaaaa
分析:
对于fork()的一些总结
没有以\n结束,不具备每次强制冲刷到缓冲区的能力,在第一次fork()时,会将父进程没有冲刷到缓冲区的a一起复制(fork())给子进程,最后等到程序运行完后一起打印出来。