首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

vfork() 调用后退出和返回的区别

在Linux系统中,vfork()调用是一种特殊的fork()调用,它允许子进程在执行exec()函数之前返回到父进程。vfork()的主要目的是为了提高性能,因为它避免了在子进程中执行exec()函数之前复制父进程的内存空间。

vfork()调用后退出和返回的区别主要体现在以下几个方面:

  1. 子进程在执行exec()函数之前不能返回到父进程。vfork()调用后,子进程必须执行exec()函数或者调用_exit()函数,否则会导致子进程的内存空间被锁定,直到父进程返回。
  2. 子进程在执行exec()函数之前不能修改父进程的内存空间。vfork()调用后,子进程不能修改父进程的内存空间,因为它们共享相同的内存空间。如果子进程需要修改父进程的内存空间,它必须先调用exec()函数或者_exit()函数。
  3. 子进程在执行exec()函数之前不能返回到父进程。vfork()调用后,子进程必须执行exec()函数或者调用_exit()函数,否则会导致子进程的内存空间被锁定,直到父进程返回。
  4. 父进程在vfork()调用后不能执行任何会修改内存空间的操作,否则会导致子进程的内存空间被锁定,直到父进程返回。

总之,vfork()调用后退出和返回的区别在于子进程必须执行exec()函数或者调用_exit()函数,而父进程在vfork()调用后不能执行任何会修改内存空间的操作。这些限制都是为了提高性能和避免内存空间被锁定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Linux内核14-clone()、fork()vfork()区别

3个函数区别: 1. clone() 创建轻量级进程,其拥有的参数是: fn 指定新进程执行函数。...当从函数返回时,子进程终止。函数返回一个退出码,表明子进程退出状态。 arg 指向fn()函数参数。...clone()其实是一个C库中封装函数,它建立新进程栈并调用sys_clone()系统调用。sys_clone()系统调用没有参数fnarg。...其实用它也完全可以实现另外两种系统调用vfork是一个过时系统调用,当时是因为写时复制(COW)技术还没有。所以才设计了这个子进程先于父进程执行创建进程系统调用。...fork就是一个创建完整进程调用。 clone、vforkfork在内核层都是调用_do_fork()这个函数。

1.7K10

RPC 调用 HTTP 调用区别

远程过程调用HTTP调用区别,不都是写一个服务然后在客户端调用么?...本文简单地介绍一下两种形式C/S架构,先说一下他们最本质区别,就是RPC主要是基于TCP/IP协议,而HTTP服务主要是基于HTTP协议,我们都知道HTTP协议是在传输层协议TCP之上,所以效率来看的话...OSI网络七层模型 在说RPCHTTP区别之前,我觉有必要了解一下OSI七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层:(从上到下) 第一层:应用层。...同步调用就是客户端等待调用执行完成并返回结果。异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果通知。如果客户端并不关心结果,则可以变成一个单向调用。...然后客户端再去处理这个返回信息,从而可以比较快速地进行开发。

91130
  • Keras系列 (4)LSTM返回序列返回状态区别

    这两个张量分开原因将在其它文章中会进行清楚解释。我们可以通过下面列出工作范例来演示如何访问LSTM层中单元格隐藏单元状态。...返回状态与序列 (Return States & Sequences) 我们可以同时访问隐藏状态序列单元状态。 这可以通过配置LSTM层来返回序列返回状态来完成。...(model.predict(data)) 返回状态与序列 (Return States & Sequences) 我们可以同时访问隐藏状态序列单元状态。...这可以通过配置LSTM层来返回序列返回状态来完成。...这次LSTM该层会返回每个输入时间步隐藏状态,然后分别返回最后一个时间步隐藏状态输出最后输入时间步单元状态。

    3K20

    系统调用库函数区别

    前言 从用户角度来看,系统调用库函数似乎没有什么区别,它们都是以C函数形式出现,并且两者都为应用程序提供服务。但从实现者角度来看,它们之间是有根本区别。那么,它们之间到底有哪些不同呢?...区别 系统调用通常不可替换,而库函数通常可替换 普通库函数调用由函数库或用户自己提供,因此库函数是可以替换。...内核调用返回一个整数值,而库函数并非一定如此 在内核中,整数或0表示系统调用成功结束,而负数表示一个出错条件。...而出错时,内核不会将其设置在errno,而是由库函数从系统调用返回对其进行设置或使用。...这得益于双缓冲实现,在用户态内核态,都应用了缓冲技术,对于文件读写来说,调用库函数,可以大大减少调用系统调用次数。而用户进程调用系统调用需要在用户空间内核空间进行上下文切换,开销较大。

    2.5K21

    进程创建fork vs vfork

    上一篇文章学习了进程基本概念,以及进程状态,最后学习了Linux中是如何描述一个进程。本节来学习Linux中进程是如何创建,以及forkvfork区别。...并且返回值等于子进程pid 简单来说就是fork创建子进程成功,父进程返回子进程pid,子进程返回0....而且细心朋友可以看出在相比fork代码,在子进程中调用了exit函数、 总结下vfork几个特点: vfork父子进程mm资源是共享,当父子进程任意一个进行修改,另外一个进程都会看到修改值...vfork中子进行是永远先执行,等待子进程退出父进程才可以执行 以上就是forkvfork区别 再通过man vfork来详细看下vfork Historic description Under...而vfork出现使得子进程父进程共享内存资源,但必须是子进程先运行父进程挂起等待子进程调用exit退出时,父进程才可以真正运行。

    1.1K30

    库函数系统调用区别联系

    一、库函数系统调用概念 库函数:库函数是语言或应用程序一部分,可以运行在用户空间中。...1.在概念对比中,可以直观感触到系统调用是依赖于操作系统,由于其依赖于平台,所以系统调用平台移植性较差。...程序员不需要关心平台差异性,如linux或windows,由库对不同平台差异屏蔽。 二、库函数系统调用在不同方面的对比。...对比 库函数 系统调用 移植性 平台移植性好 依赖于内核,不保证移植性 执行区域 用户空间 内核空间 开销 属于过程调用,开销小 需要中断,在用户空间内核空间进行切换开销大 数量 库函数数量较多 系统调用较少...没有使用系统调用库函数,执行效率通常比系统调用高。因为使用系统调用时,需要通过中断进行上下文切换以及由用户态向内核态转移。

    86620

    Linux中fork,vforkclone详解(区别与联系)include #include #include #include

    execve启动新应用程序为止 由vfork创建出来得子进程不应该使用return返回调用者,或者使用exit()退出,但是它可以使用_exit()函数来退出 如果我们使用return来退出,你会发现程序陷入一种逻辑混乱重复...子进程在使用return返回到了调用处,因此父进程又创建出一个新vfork进程, ?...由此可见,这个系统调用是用来启动一个新应用程序。其次,子进程在vfork()返回直接运行在父进程栈空间,并使用父进程内存和数据。这意味着子进程可能破坏父进程数据结构或栈,造成失败。...为了避免这些问题,需要确保一旦调用vfork(),子进程就不从当前栈框架中返回,并且如果子进程改变了父进程数据结构就不能调用exit函数。...在子进程退出或开始新程序之前,内核保证了父进程处于阻塞状态 用vfork函数创建子进程,子进程往往要调用一种exec函数以执行另一个程序,当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其

    3.4K50

    Linux进程控制

    vfork()函数 vfork()与fork()区别是:fork()需要复制父进程数据段,而vfork()不需要完全复制,在子进程调用exec()或exit()之前,子进程与父进程共享数据段。...fork()不对父子进程执行次序作限制,而vfork()调用后,子进程先运行,父进程挂起,直到子进程调用了exec()或exit(),父子进程执行次序才不再有限制。...与一般情况不同,exec函数族执行成功不会返回,因为调用进程实体,包括代码段、数据段堆栈段都被新内容取代,只是进程ID等一些表面上信息仍保持原样。...waitpid()示例 父进程子进程分别睡眠10秒钟1秒钟,代表所作相应工作。父进程利用工作简短间歇查看子进程是否退出,如果退出就收集它。.../bin/sh-cmdstring来执行参数cmdstring字符串所代表命令,此命令执行完随即返回调用进程。

    2K30

    浅谈Linux vfork与fork简单对比分析

    ,并且将父进程部分数据结构内容拷贝到子进程,最后再将子进程添加到系统进程列表中,添加完成fork返回,开始调度。...vfork用处: vfork()跟fork()类似,都是创建一个子进程,这两个函数返回值也具有相同含义。...但是vfork()创建子进程基本上只能做一件事,那就是立即调用_exit()函数或者exec函数族成员,调用任何其它函数(包括exit())、修改任何数据(除了保存vfork()返回那个变量)、执行任何其它语句...fork与vfork区别 1.vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程进一步动作,则会导致死锁。...2.fork要拷贝父进程进程环境;而vfork则不需要完全拷贝父进程进程环境,在子进程没有调用execexit之前,子进程与父进程共享进程环境,相当于线程概念,此时父进程阻塞等待。

    2.3K31

    直观讲解一下 RPC 调用 HTTP 调用区别

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用HTTP调用区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!...本文简单地介绍一下两种形式C/S架构,先说一下他们最本质区别,就是RPC主要是基于TCP/IP协议,而HTTP服务主要是基于HTTP协议,我们都知道HTTP协议是在传输层协议TCP之上,所以效率来看的话...整理了一份Java面试宝典完整版PDF OSI网络七层模型 在说RPCHTTP区别之前,我觉有必要了解一下OSI七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层:(从上到下)...什么是异步调用? 同步调用就是客户端等待调用执行完成并返回结果。 异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果通知。...然后客户端再去处理这个返回信息,从而可以比较快速地进行开发。

    1.5K01

    直观讲解一下 RPC 调用 HTTP 调用区别

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用HTTP调用区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!...本文简单地介绍一下两种形式C/S架构,先说一下他们最本质区别,就是RPC主要是基于TCP/IP协议,而HTTP服务主要是基于HTTP协议,我们都知道HTTP协议是在传输层协议TCP之上,所以效率来看的话...OSI网络七层模型 在说RPCHTTP区别之前,我觉有必要了解一下OSI七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层:(从上到下) 第一层:应用层。...同步调用就是客户端等待调用执行完成并返回结果。异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果通知。如果客户端并不关心结果,则可以变成一个单向调用。...然后客户端再去处理这个返回信息,从而可以比较快速地进行开发。

    3.1K20

    微服务间调用应用内调用有啥区别

    大家平时需要在应用内调用rpc接口也比较多,那么有没有思考过微服务之间调用应用内直接调用有什么区别呢?...面试时是不是经常被被问到微服务呢,本篇文章针对 微服务间方法调用应用内方法调用有啥区别这个很小点,谈谈我经验 微服务调用特点 先从单体应用说起 ?...) Transport cost is zero(网络传输耗时为0) The network is homogeneous(网络是同类) 我们需要做什么 存在上述两个问题,那么我们需要在写微服务间方法调用时注意什么...出于某种原因,我们服务mock了rpc调用数据,返回null。结果其他服务整个前台页面挂了,挂了,挂了。...没有正确设置超时时间 总结 微服务调用应用内调用有很大区别,我们不能在进行服务间调用时无感知,需要知道它面临问题 对外部有了依赖,外部是不可靠 有了网络调用 解法可以精炼为4条 根据业务需要,

    86920

    直观讲解一下 RPC 调用 HTTP 调用区别

    HTTP调用区别,不都是写一个服务然后在客户端调用么?...本文简单地介绍一下两种形式C/S架构,先说一下他们最本质区别,就是RPC主要是基于TCP/IP协议,而HTTP服务主要是基于HTTP协议,我们都知道HTTP协议是在传输层协议TCP之上,所以效率来看的话...OSI网络七层模型 在说RPCHTTP区别之前,我觉有必要了解一下OSI七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层:(从上到下) 第一层:应用层。...同步调用就是客户端等待调用执行完成并返回结果。异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果通知。如果客户端并不关心结果,则可以变成一个单向调用。...然后客户端再去处理这个返回信息,从而可以比较快速地进行开发。

    81410

    《Linux操作系统编程》 第六章 Linux中进程监控: fork函数使用,以及父子进程间关系,掌握exec系列函数

    ) ▪ 父进程继续执行fork函数调用之后代码,子进程也从fork函数调用之后代码开始执行 ▪ 为了提高效率,fork,子进程并不立即复制父进程数据段、堆栈,采用了写时复制机制(Copy-On-Write...Linux中进程退出方式 ▪ 正常退出 - 在main函数中执行return返回 - 在任意代码中调用exit函数或_exit函数 ▪ 异常退出 - 在任意代码中调用abort函数 - 进程接收到终止信号...(3) exitreturn区别 ▪ exit_exit是函数,有参数。...exit _exit执行完把控制权交给内核。 ▪ return是函数执行完返回。renturn执行完把控制权交给调用函数。...答:exec函数簇是用来用指定程序替换当前进程所有内容。exec系列函数经常在fork、vforkclone三个函数使用之后调用,来创建一个全新程序运行环境。

    17610

    Linux 创建子进程执行任务实现方法

    fork 函数特点是 “调用一次,返回两次”:在父进程中调用一次,在父进程子进程中各返回一次。...在父进程中返回返回值为子进程 PID,而在子进程中返回返回值为 0,并且返回都将执行 fork 函数调用之后语句。如果 fork 函数调用失败,则返回值为 -1。...注意:执行 forkdemo 程序时输出是会发生变化,可能先打印父进程信息,也可能先打印子进程信息。 vfork 系统调用 vfork 系统调用 fork 系统调用功能基本相同。...为了防止父进程重写子进程需要数据,父进程会被 vfork 调用阻塞,直到子进程退出或执行一个新程序。...exec 族函数 使用 fork/vfork 创建子进程执行父进程相同程序(但有可能执行不同代码分支),子进程往往需要调用一个 exec 族函数以执行另外一个程序。

    3.8K11

    Linux内核15-内核如何创建进程

    _do_fork()函数 不论是clone()、fork()还是vfork(),它们最核心部分还是调用_do_fork()(一个与体系无关函数),完成创建进程工作。...其实,_do_forkdo_fork在进程复制时候并没有太大区别, 他们就只是在进程tls复制过程中实现有细微差别 下面是_do_fork源代码: long _do_fork(unsigned...child_tidptr, NULL, trace, tls, NUMA_NO_NODE); /* * 在唤醒新线程之前,先检查指针是否合法 * 因为如果线程创建立即退出的话...:创建旧进程副本,比如进程描述符子进程运行需要其它内核数据结构。...基本上,新进程执行恰恰在fork()、vfork()或clone()系统调用结束之时。该系统调用返回值保存在寄存器eax中:对于子进程是0,对于父进程来说就是子进程PID。

    2.1K10

    进程详解(1)——可能是最深入浅出进程学习笔记

    一个进程要执行一个不同程序,一般fork之后立即调用exec vfork函数 vfork与fork对比: 相同: 返回值相同 不同: fork创建子进程,把父进程数据空间、堆栈复制一份;vfork创建子进程...,与父进程内存数据共享; vfork先保证子进程先执行,当子进程调用exit()或者exec,父进程才往下执行 为什么需要vfork?...2)而main()函数return,通常会调用 exit()或相似的函数(如:_exit(),exitgroup()) 3)这时,父进程收到子进程exit(),开始从vfork返回,但是尼玛,老子栈都被你子进程给...(注:栈会返回一个诡异一个栈地址,对于某些内核版本实现,直接报“栈错误”就给跪了,然而,对于某些内核版本实现,于是有可能会再次调用main(),于是进入了一个无限循环结果,直到vfork 调用返回...waitpid返回值:正常返回子进程号;使用WNOHANG且没有子进程退出返回0;调用出错返回-1; 运行如下演示程序 ?

    50230

    Linux下进程创建过程分析(_do_fork do_fork详解)--Linux进程管理与调度(八)

    clone系统调用入口地址分别是sys_fork, sys_vforksys_clone, 而他们定义是依赖于体系结构, 因为在用户空间内核空间之间传递参数方法因体系结构而异 系统调用参数传递...如果do_fork成功, 则新建进程pid作为系统调用结果返回, 否则返回错误码 sys_vfork实现 早期实现 架构 实现 arm arch/arm/kernel/sys_arm.c, line...parent_tidptrchild_tidptr), 用于与线程库通信 创建子进程流程 _do_fork早期do_fork流程 _do_forkdo_fork在进程复制时候并没有太大区别...在子进程生成, 内核必须执行下列收尾操作: 调用 copy_process 为子进程复制出一份进程信息 如果是 vfork(设置了CLONE_VFORKptrace标志)初始化完成处理信息 调用 wake_up_new_task...在Linux中进程退出时要将其退出原因告诉父进程,父进程调用wait()系统调用后会在一个等待队列上睡眠。 schedule()。调用进程调度器,因为此进程已经退出,切换到其他进程。

    2.6K20

    Js 使用new关键字调用函数直接调用函数区别

    注意:构造函数在不返回情况下,默认返回新对象实例。 看到这里,我就将上面的例子new关键字去掉,发现原来结果一样。...person.sayName(); 得出结论:使用new关键字是将函数当作构造函数调用,即为构造对象,若没有人为重写调用构造函数时返回值,那么返回对象是由解析器自己生成。...不使用new关键字调用函数,即为普通函数调用。 随即想到若是函数返回值是function型呢?...alert(test01==test02);//false 虽然浏览器运行结果一样,但是比较结果还是false,因为 Javascript 对于 Object Function 比较是基于引用...),虽然new函数与直接调用函数产生结果等同,但是是两个不同过程,一个是构造对象、一个是函数调用

    3.7K10
    领券