fork和vfork与进程和子进程

1 篇文章 0 订阅
1 篇文章 0 订阅
fork和vfork同样可以创建子进程,但fork会把父进程的资源做拷贝,而vfork会直接在父进程的地址空间中运行。
但是fork也有共享的内容,比如文件描述符的文件表,父子进程的没个相同描述符共享同一个文件表,因此,父、子进程对同一文件使用相同的文件位移向量。
一个进程可以有多个子进程,但只能有一个父进程,所以fork和vfork会把子进程的PID作为返回值。
vfork一般用于创建一个新进程,再用新进程去exec一个新的程序。(相比fork同样的方法来说效率更高)
另外,fork在创建操作后,是父进程先执行还是子进程,是不确定的,所以需要相应的调度方法。而vfork在创建会保证子进程先执行,当子进程exec或者_exit后父进程才会被调度。(在vfork的子进程中要慎用exit,exit操作会执行关闭I/O等操作)
也因此,fork会出现父进程先结束的情况,这时候子进程会由init进程领养,每个进程终止的时候,内核都会去逐个检查活动进程,以判断它是否是要终止的进程的子进程,如果是,则把子进程的父进程ID置为1(init进程ID)。以保障每个进程都有父进程。
此外,fork的父进程需要即时回收子进程的状态,以避免出现僵死进程(就是那些ps时发现状态为Z的),这就用到wait和waitpid函数了,回收可以得到子进程的信息(包括进程ID,终止状态,cpu信息),并且由内核去释放子进程对系统资源的占用。(如果当时父进程是init时,内核会自动执行这一步)
说到回收子进程,子进程结束时,内核会向父进程抛送SIGCHLD信号,这个信号系统默认是SIG_IGN,所以在多进程操作时,需要去重写SIGCHLD的操作函数。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值