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

为什么在父进程调用wait()函数之前,子进程没有退出?

在父进程调用wait()函数之前,子进程没有退出的原因是父进程还没有等待子进程的退出状态。

在多进程编程中,当父进程创建子进程后,子进程会独立执行其对应的代码,父进程也会继续执行自己的代码。当子进程执行完毕后,它会变成一个"僵尸进程",即子进程退出了但父进程还没有调用wait()或waitpid()函数来获取子进程的退出状态。僵尸进程的存在不会占用系统资源,但它会占用一个进程ID,因此过多的僵尸进程可能会导致进程ID耗尽。

为了避免僵尸进程的积累,父进程需要通过wait()或waitpid()函数来获取子进程的退出状态。调用这些函数后,父进程会阻塞等待子进程的退出,并且获取子进程的退出状态信息。一旦父进程调用了wait()或waitpid()函数,子进程就会被彻底销毁,不再是僵尸进程。

所以,在父进程调用wait()函数之前,子进程还没有退出,因为父进程还没有去获取子进程的退出状态信息。

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

相关·内容

Linux进程控制——Linux进程等待

进程等待的方法 3.1 wait方法 我们可以通过系统调用来等待进程:wait函数 wait等待任意一个子进程的退出,如果等待成功他将返回子进程的pid,失败则返回-1 我们就用一段代码来看看wait:...)取消,看看在子进程退出之前父进程在干什么 #include #include #include #include<sys...(10); } return 0; } 观察父进程等待过程 通过这个视频我们又能发现两个进程一起运行,但是在子进程没有退出之前,父进程一直在wait上等待,并且并没有出现子进程僵尸状态而是直接回收了...总结拓展 拓展一:父进程如何得知子进程的退出信息 父进程调用wait()/waitpid()来获取子进程的退出信息,调用的接口就传入了一个status参数,而父进程中存在着一个statusp的指针...*statusp = (exit code<<8)| exit siganl 这样父进程就获取到了子进程的退出信息 拓展二:我们为什么不用全局变量获取子进程的退出信息而用系统调用?

12310

Linux系统编程:进程控制(创建,终止,等待)

1.在fork返回之前,创建了子进程的 PCB数据结构,以及拷贝了一份父进程的地址空间和页表;此时页表是出于只读,一旦修改就会写实拷贝; 2.在修改之前,虚拟地址都是一样的,且映射的物理地址也是一样的;...查看上一个进程的退出码 1.在main函数中return 2.调用exit 3.调用_exit 2.2main函数返回值 main函数虽然是主函数,但毕竟也是个函数,最后的返回值即使告诉操作系统是否正常结束...退出码的作用就是告诉父进程,子进程的退出状态-是正常结束了还是出现错误终止了; 2.为什么要用退出码判断进程是否出错,直接printf不好吗?...调用函数,自己帮我们填充这个变量的; wait函数等待成功后,status就会获得该子进程的退出码; 为什么不使用全局变量来获取子进程的退出状态呢?...,那么父进程将不会一直阻塞,而是会返回0后继续执行后面的代码,如果子进程退出了,那么返回子进程的PID; 返回值: 正常执行(没有设置WNOHANG):此时和wait一样; 等待成功就会返回子进程pid

10710
  • 【Linux】进程详解:进程的创建&终止&等待&替换

    子进程继承了父进程中所有的打开文件,所以父子进程共享所有的文件 2.2 fork 函数返回值 在之前的博客中就说过了fork()函数有两个返回值,子进程返回0,父进程返回子进程的PID,下面就需要解决三个问题...fork()为什么会出现两个返回值❓ 根据fork()函数在内核中的操作就包含了子进程的数据结构的创建,所以在fork()返回之前,子进程就已经被创建出来了。...而一旦被创建出来一个独立的进程就会有返回值,所以调用这个fork()函数的父进程有一个返回值,而创建出的子进程也会有一个返回值 因为这两个过程是在fork()函数内部就已经完成了,因此我们在fork...()函数外面看到的现象就是一个函数出现了两个返回值 .为什么子进程要返回0,而父进程要返回子进程的PID❓ 一个父进程可以创建很多的子进程,而每一个子进程都只能有一个父进程 而父进程创建子进程是为了让子进程完成任务的...其余的数据结构类似PCB,mm_struct,页表等等结构并没有改变。 在子进程进行程序替换之后,父进程中的代码段和数据段并没有受到任何的影响。

    38510

    Linux进程控制

    那么,为什么会这样?接下来我们好好地讨论一下fork函数。 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...因为在到达return指令之前,子进程就已经被创建好了,并且有可能已经在OS的运行队列当中,准备被调度,因此,此时对于fork函数的这个return指令,不仅仅是被父进程使用,还会给子进程拿去使用。...二、进程终止: 在谈进程退出情况之前,我们先来聊聊退出码的问题。 相信我们在写代码的时候,特别是使用C/C++写代码时,我们都会写main函数,然后最后写一个return 0。...如,子进程运行完成,结果对还是不对,或者是否正常退出。 4.父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息 进程等待方法 1.wait方法。 wait()是一个函数。...阻塞与非阻塞 阻塞:当父进程通过系统调用wait/waitpid去获取子进程的资源时,但子进程还没有退出,等待的这个状态,就叫做阻塞。

    2.4K30

    【Linux】开始掌握进程控制吧!

    2 进程创建 2.1 fork函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...2.2 fork函数返回值 子进程返回0 父进程返回的是子进程的pid 那为什么父进程返回子进程PID ,给子进程返回0呢???...一旦出现异常,退出码就没有意义了!!! 为什么出异常才是最重要的!!! 那为什么会出现异常呢??? 原因是:进程出现异常的本质是进程收到来自OS发给进程的信号!...父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息 也就是说,任何进程在退出时都要被父进程进行等待,不然子进程处于僵尸进程就会造成内存泄漏!!!...,并且会存在一段时间的窗口期,此时子进程处于僵尸进程: 在这个父进程等待的过程中,父进程一直在等待子进程的退出,处于阻塞等待状态。

    10910

    【Linux修炼】11.进程的创建、终止、等待、程序替换

    #include pid_t fork(void); //返回值:子进程中返回0,父进程返回子进程id,出错返回-1 那么在调用fork函数之前只有一个进程,当进程调用fork时,...如,子进程运行完成,结果对还是不对,或者是否正常退出。 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息 总结:进程为什么要等待?...sleep10秒,而父进程sleep15秒,这样当子进程运行完毕exit时,父进程在子进程结束的5s内不会回收子进程,这就造成子进程变成Z(僵尸)状态,当5s之后,父进程就会通过wait回收子进程,ret...5秒,子进程就变成了Z+状态,当父进程执行时,通过调用wait将子进程回收,子进程就结束了,最后的5秒只剩下父进程处于S+状态。...在我们之前的代码中,main函数通常是这样的参数:(VS上没有是因为编译器在编译时自动生成) 答:exec先被调用。解释:exec系列的函数的功能是将我们的程序加载到内存中!

    6.2K00

    【Linux】Linux进程控制——进程创建、进程终止及进程等待详解

    ⭐进程创建 fork函数初识 在Linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...例如子进程从fork返回后,调用exec函数。...⭐进程等待 进程等待的必要性 在Linux进程提到过,子进程退出,父进程如果不管不顾,不读取子进程的退出信息,就可能造成“僵尸进程”的问题,进而造成内存泄漏。...(查看进程的退出码) options: WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。...注: 如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。

    14410

    【Linux】进程控制

    进程为什么要等待 1.父进程通过进程等待的方式,回收子进程资源 2.获取子进程退出信息 进程等待的方法 wait 返回值:成功返回被等待进程pid,失败返回-1。...若正常结束,则返回该子进程的ID 对应的错误: 僵尸进程退出的时候对应信息放在哪: 子进程和父进程有对应的pcb信息,父进程调用waitpid,子进程退出的时候把对应的代码和信号保存起来,保存到...,父进程检测之后立即退出 if (ret == 0) { //waitpid调用成功&&子进程没退出 //子进程没有退出,...,我们需要注意到:execl系列的函数结尾以NULL结尾 同时,这里为什么第二个printf输出语句没有执行?...替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。

    20030

    Linux-进程控制

    区别:   exit是用来终止进程的,exit(退出码),在我们进程的任何地方调用exit() 都表示进程退出,而_exit与exit的区别就是,exit() 会刷新缓冲区(以后会详谈)。   ...实际上,_exit()函数是Linux下的一种系统调用,为什么要存在exit() 和 _exit() 两个不同的接口呢?...进程等待   我们之前说过,如果一个进程变僵尸那么使用kill -9也无能为力,造成僵尸的原因就是子进程退出了,父进程并没有将资源回收所导致的,所以系统提供了一些系统调用,通过父进程等待的方式获取子进程退出信息...\n"); sleep(3); return 0; }   图中画的红色框框表示僵尸了一段时间,而当父进程开始回收之后,子进程的僵尸状态就没有了。   ...,父进程等待子进程退出,这期间父进程不做任何事情 当waitpid函数以非阻塞调用时,父进程以轮询的方式每段时间检测子进程是否退出,没退出就返回做父进程的事情 参数 0 WNOHANG   我们以下面这段代码来理解非阻塞

    11310

    Linux:进程的创建、终止和等待

    2.2.2 退出码概念 父进程可以通过拿到子进程的退出码,不同的退出码分别代表的是不同的原因!! 问题1:为什么需要有退出码呢??...的区别:一个是系统调用接口(更底层),一个是库函数,其实exit最后也会调用exit, 但在调用exit之前,还做了其他工作: 1....所以我们最关键的是要看父进程是否收到了信号,如果没有收到就没有异常(具体如何收到,就涉及到进程等待的知识) 三、 进程等待 3.1 如何理解 3.1.1 是什么 通过系统调用接口wait/waitpid...——>(1)子进程的代码是否异常??(2)没有异常,结果对吗,不对的原因是什么?  问题2:父进程为什么不定义全局变量的status,而必须用wait等系统调用来获取状态呢??...3.2.2 阻塞和非阻塞轮询  如果子进程一直不退出,父进程默认在wait的时候,调用这个系统调用的时候,也就不返回,默认叫做阻塞状态 ——>通过这个我们可以知道阻塞不仅仅只是发生在向硬件发送请求时等待他的状态准备好

    19710

    【Linux】进程控制

    还有一种方法就是在程序代码过程中写fork函数,再父进程的状态下,创建子进程。...此时的状态已经是Z状态了,所以代码和数据也不会再调用了,所以才只会留下task_struct。 2、2、进程终止的3种情况 先问一个问题: 为什么之前我们写程序的时候main函数的返回都是0呢?...2、4、如何终止 1、main函数return,表示进程终止(非main函数,return,函数结束) 2、代码调用exit函数(注意:在代码的任意位置调用exit,都表示进程终止) 3、_exit—system...3、2、进程如何等待 wait:等待成功时,返回子进程的pid。作用是等待任意一个子进程的退出 如果子进程没有退出的话,父进程就会在阻塞等待。...(用来查看进程的退出码) options: WNOHANG:若pid指定的子进程没有结束,则waitpid()函数返回0,不予等待。

    7110

    wait和waitpid

    在Linux中,wait 和 waitpid 是用于进程控制的系统调用,它们主要用来让父进程等待子进程的终止,并获取子进程的退出状态。下面详细介绍它们的用法和区别。...1. wait() 函数 wait() 会阻塞调用进程,直到一个子进程终止。...wait() 在没有子进程时返回 -1 并设置 errno 为 ECHILD。...它们主要用于进程管理和控制,是系统编程中非常重要的工具  1:是什么 2:为什么也就是必要性 之前说过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...因为进程具有独立性,所以要用wait等系统调用 查看子进程错误信息码,和exit返回的值        退出信号(signal) 另一种写法(这里的进程出异常是子进程出异常了,wait failed是父进程调取出异常了

    10410

    Linux进程控制

    0 进程没有正常运行,退出码没有任何意义 2.6.进程退出的方式 2.6.1.正常退出 就是在正常的程序代码中,如main函数走到结尾,或者是遇到return。这样的正常结束。..._exit()不会自动执行exit()函数所执行的清理工作,需要确保在调用它之前,手动处理所有必要的清理工作,然后向操作系统返回退出码。...因为进程具有独立性,子进程对共享数据的修改,父进程是不可见的。 问题2:为什么要有wait、waitpid?...为了避免子进程僵尸,造成内存泄漏,父进程需要通过wait、waitpid等函数来回收子进程资源,同时可以获取到子进程的退出信息。...exec函数的行为:仅在调用它的进程中生效,而不会影响到父进程。由于exec函数是在子进程中调用的,因此只有子进程的映像被替换,父进程的映像保持不变,父进程继续执行其后续代码。

    9610

    僵尸进程

    1.什么是僵尸进程?     UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,而父进程还没有结束,那么他将变成一个僵尸进程.    ...,成为他的父进程,从而保证每个进程都会有一个父进程.而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程. 2.子进程结束后为什么要进入僵尸状态?    ...如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。     如果父进程在子进程结束之前退出,则子进程将由init接管。...    1、父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起     2....如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收     3.

    1.4K50

    Linux系统 —— 进程控制系列 - 进程的等待:wait 与 waitpid

    进程的等待 我们之前在僵尸那一篇讲过,⼦进程退出,⽗进程如果不管不顾,就可能造成‘僵⼫进程’的问题,进而造成内存泄漏 我们之前并没有提出解决方法,那么我们今天来说出解决方法:等待,一个进程进入僵尸的状态的话我们就只能进行回收...答案是:如果等待子进程,子进程没有退出,那么父进程就会阻塞在wait调用处(scanf) 我们可以看到:我们子进程跑5秒,5秒以内子进程和父进程的同时运行,5秒之后,子进程变僵尸进程 我们父进程是属于...进程等待就是创建出子进程之后,父进程使用wait或者waitpid来等待子进程的方式就叫做进程等待 wait和waitpid的作用就是等待一个进程, 当这个进程退出后, 那么父进程就可等待子进程...: 若pid指定的⼦进程没有结束,则waitpid()函数返回0,不予以等 待。...阻塞与非阻塞等待 如果我们的子进程对应的退出,那么我们就立即返回,我们把这种特性称之为非阻塞调用 阻塞等待就是子进程不退出, 父进程默认在wait的时候, 也就是调用这个系统调用的时候,

    10910

    探索进程控制第一弹(进程终止、进程等待)

    进程创建 初识fork函数 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...fork函数返回值 子进程返回0 父进程返回的是子进程的pid 如何做到有两个返回值? 探索父进程和子进程 文章中有详细解释。 为什么给父进程返回的是子进程的pid,给子进程返回0?...进程等待 概述 什么是进程等待? 任何子进程,在退出的情况下,一般必须要被父进程等待。 进程在退出的时候,如果父进程不管不顾,退出进程,处于僵尸状态(Z),存在内存泄漏。 为什么?...由此可以看出,等待会解决进程的僵尸问题。 将上述代码sleep(10)代码注释掉,子进程运行5秒后直接退出,立马执行父进程等待。如果子进程没有退,其实父进程一直在阻塞等待。...父进程不被调度,在执行wait发现子进程还没有退出,父进程就不要调度,实际上就是将父进程PCB列入等待队列,处于S状态(非运行状态),等到子进程退出,唤醒父进程。

    15910

    【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

    之前在讲进程状态的时候,我们谈到过僵尸进程,当时说僵尸进程其实是一个问题,如果子进程退出,父进程不读取子进程退出的信息,那么子进程就会变为僵尸进程,从而导致内存泄露问题的产生,我们可以通过进程等待的方式来解决僵尸进程问题...通过运行结果可以看出,在前10秒钟,两个进程都是休眠S状态,因为在等待显示器就绪,在接下来的5秒钟,子进程变为了僵尸进程,状态由S变为Z,然后在wait调用结束之后,子进程被父进程成功回收,只剩下继续休眠...当子进程还没有死的时候,也就是没有退出的时候,父进程调用的wait或waitpit需要等待子进程退出,系统调用接口也不返回,这段时间父进程什么都没做,就一直等待子进程退出,这样的等待方式,称之为阻塞式等待...exec系列的函数只有在调用失败的时候才有返回值,这个返回值是-1,那为什么exec系列的函数没有调用成功时的返回值呢?...这也就能解释为什么echo能够打印本地变量了,我们之前将echo理解为一个可执行程序,也就是shell的子进程,但是我们说子进程只能继承父进程的环境变量,而不能继承本地变量,所以当时就陷入echo为什么能够打印出本地变量的疑问当中

    14.9K30

    【Linux】进程控制:理解什么是进程创建,进程终止,进程等待 | 进程替换

    答案是父进程。子进程在退出时,会成为僵尸进程,需要父进程的回收。 那么父进程期望获得子进程退出时得哪些信息呢?...三.进程等待 进程等待是什么? 通过系统调用wait/waitpid,来进行对子进程进行状态检测与回收的功能! 为什么要进程等待?...即在子进程退出前,父进程什么也不做,一直在等着子进程退出,此时父进程处于阻塞状态。...即父进程会检查一次看子进程有没有退出,没有则返回0,此时父进程可以做一些自己的事,而不是一味的等待子进程的退出,在子进程退出前循环以上的过程,直到子进程退出,返回 >0 的一个数,返回负数则表示等待失败...单进程的进程替换 在理解什么是进程替换之前,我们先来看看进程替换怎么使用,下面是操作系统提供的进程替换的一些函数 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。

    33810

    【Linux】深入理解进程控制:从创建到终止和进程等待

    进程创建 fork函数 fork 函数是 Unix/Linux 系统中用于创建新进程的系统调用。调用 fork 后,当前进程(父进程)会被复制,创建出一个新的进程(子进程)。...fork函数特点: 返回值: 在父进程中,fork 返回子进程的 PID(进程ID)。 在子进程中,fork 返回 0。 如果发生错误,fork 返回 -1,并且不会创建新进程。...进程等待 关于进程等待的三个函数,我们先从第一个函数说起: wait wait 函数在 Unix 和 Linux 系统中用于让父进程等待其子进程结束,并收集子进程的退出状态。...这个函数在进程控制中尤为重要,因为它允许父进程在子进程完成之前暂停执行,避免“僵尸进程”的出现。 一般而言父进程创建子进程就需要等待子进程,子进程结束之后将子进程的僵尸状态回收掉。...总结 在本篇博客中,我们深入探讨了Linux进程控制的核心概念,从进程的创建、状态管理到终止及等待机制。通过了解 fork、exec 和 wait 等系统调用,我们掌握了如何有效地管理进程的生命周期。

    17110

    【Linux】详解进程终止&&进程等待

    在我们的代码进程中,在任意地方调用exit都表示进程退出。...三、进程等待 3.1、进程等待的必要性 1、之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...4、父进程通过进程等待(wait)的方式,回收子进程资源,获取子进程退出信息  3.2、进程等待的方法 3.2.1、wait方法 wait方法里的参数为输出型参数,可以设置为NULL。...调用wait函数父进程默认进行阻塞等待,会等待任意一个子进程退出。等待成功,wait会返回子进程的pid,等待失败返回小于0的值。 ...阻塞等待时父进程会阻塞在waitpid这里一直等待子进程返回,非阻塞等待采用轮询的方法查看子进程的退出信息,在轮询的间隙父进程可以继续做别的工作。

    29910
    领券