fork()、COW和vfork()的区别

本文探讨了fork()和vfork()在创建子进程时的区别,重点介绍了COW(Copy-On-Write)技术。当一个进程调用fork(),内核会为子进程复制整个地址空间,而vfork()则共享父进程的地址空间直至子进程执行exec()。在子进程中,fork()返回0,父进程获得子进程ID;vfork()中,子进程先执行,直到调用exec()或exit()。每个进程有独立的正文段、数据段、堆和栈,内核通过映射管理物理内存。
摘要由CSDN通过智能技术生成

一个进程可以通过调用fork()或者vfork()函数来创建一个新进程,调用进程被成为父进程,产生的新进程叫做子进程。而在调用(以fork()为例)fork()的时候,会产生两个返回值,一个是返回给父进程,另一个是返回给子进程。而用户可以通过返回值来判断哪个是父进程,哪个是子进程。在子进程中返回值为0,而在父进程中的返回值为子进程ID。这种安排是有理由的。一个进程可以有多个子进程,但是却只能有一个父进程,因此我们可以通过getppid()来获取父进程的ID,但是却没有函数用来获取子进程的ID,因此便将子进程的ID返回给父进程。下面的例子可以说明这一点:




运行结果如下:




那么,在一个进程创建子进程的时候会发生什么呢?


首先我们要了解,每个进程都有自己的虚拟地址空间,包括正文

fork和vfork是两个在操作系统中常见的系统调用函数,它们用于创建新的进程。它们之间的主要区别在于父进程和子进程之间的共享资源和执行顺序。 1. fork函数: - fork函数通过复制父进程的地址空间创建一个新的子进程。父进程和子进程之间共享文件描述符、内存映射等资源,但是每个进程有自己独立的副本。 - 子进程是父进程的副本,从fork函数调用的位置开始执行,父进程和子进程的执行顺序是不确定的,取决于操作系统的调度策略。 - 子进程会继承父进程的打开文件、信号处理器、当前工作目录等状态。 - fork函数返回两次,父进程中返回子进程的ID,子进程中返回0。 2. vfork函数: - vfork函数也是通过复制父进程的地址空间创建一个新的子进程,但是与fork不同,vfork直接共享父进程的地址空间。 - 子进程共享父进程的数据段、堆栈段等资源,但是不共享代码段。子进程在执行exec或者_exit后会替换父进程的地址空间。 - 子进程必须在调用exec或者_exit之前终止或者执行另一个程序,否则可能导致父进程和子进程之间的资源冲突。 - vfork函数返回子进程的ID,与fork函数不同的是,vfork函数不会返回两次。 总结: - fork函数创建子进程时,父进程和子进程之间共享资源但具有各自独立的副本。子进程可以在任何时间执行,父进程和子进程的执行顺序不确定。 - vfork函数创建子进程时,子进程共享父进程的地址空间,但是不共享代码段。子进程必须在exec或者_exit之前终止或者执行另一个程序。 - 在使用fork和vfork时,需要根据具体的需求和场景选择合适的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值