vfork和fork区别

发布时间:2020-10-24 22:58:05 作者:露露simile
来源:网络 阅读:512

fork:


   一个现有进程可以调用fork创建一个新进程。


   返回值:子进程中返回0,父进程返回子进程ID,出错返回零。

    子进程是父进程的副本。


一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。

子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的"副本",这意味着父子进程间不共享这些存储空间。

UNIX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。在不同的UNIX (Like)系统下,我们无法确定fork之后是子进程先运行还是父进程先运行,这依赖于系统的实现。所以在移植代码的时候我们不应该对此作出任何的假设。

为什么fork会返回两次?

由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。过程如下图。

在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

父进程的fork函数返回的值指向子进程的进程id, 因为子进程没有子进程,所以其fork函数返回的值为0.

调用fork之后,数据、堆栈有两份,代码仍然为一份但是这个代码段成为两个进程的共享代码段都从fork函数中返回,箭头表示各自的执行处。当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂。

    fork的一个特性是父进程的所有打开文件描述符都被复制到子进程中。父子进程的每个相同的打开描述符共享一个文件表项。

    fork之后处理的文件描述符有两种常见的情况:


    1.父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理。当子进程终止后,子进程对文件偏移量的修改已执行的更新。


    2. 父子进程各自执行不同的程序段。这种情况下,在fork之后,父字进程各自关闭他们不需要使用的文件描述符,这样就不会干扰对方使件描用文件述符。 这种方法在网络服务进程中经常使用。


父子进程之间的区别:


1. fork的返回值

2. 进程ID不同
3. 具有不同的父进程ID
4. 子进程的tms_utime、 tms_stime、 tms_cutime及tms_ustime均被设置为0
5. 父进程设置的文件锁不会被子进程继承
6. 子进程的未处理闹钟被清除
7. 子进程的未处理信号集被设置为空集

fork调用失败的原因:


1. 系统中有太多的进程

2. 实际用户的进程数超过了限制

vfork和fork区别


vfork函数


vfork用于创建一个新进程,而该新进程的目的是exec一个新程序。 vforkfork都创建一个子进程,但它不将父进程的地址空间复制到子进程中,因为子进程会立即调用exec,于是不会存访问该地址空间。相反,在子进程调用execexit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。vforkfork另一区别在于: vfork保证子进程先运行,在它调用exec或( exit)之后父进程才可能被调度运行


推荐阅读:
  1. [Linux进程]使用vfork创建子进程
  2. fork和vfork函数

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

区别 fork vfork

上一篇:PHP成长记(二) —— SOA&RESTful软件架构

下一篇:Python实现针对给定字符串寻找最长非重复子串的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》