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的操作函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值