对于fork()的一些总结

本文详细解析了fork()函数的工作原理及应用案例,通过不同的代码片段展示了如何使用fork()函数来创建子进程,并深入探讨了子进程与父进程间的交互细节。文章还解释了写时拷贝机制以及内存管理在进程创建过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现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())给子进程,最后等到程序运行完后一起打印出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值