首页
学习
活动
专区
工具
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 这样进程就获取到了进程退出信息 拓展二:我们为什么不用全局变量获取进程退出信息而用系统调用?

10810

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

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

23010
  • 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发给进程的信号!...进程通过进程等待的方式,回收进程资源,获取进程退出信息 也就是说,任何进程退出时都要被进程进行等待,不然进程处于僵尸进程就会造成内存泄漏!!!...,并且会存在一段时间的窗口期,此时进程处于僵尸进程: 在这个进程等待的过程中,进程一直等待进程退出,处于阻塞等待状态。

    10110

    【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会立即返回,并且释放资源,获得进程退出信息。

    11610

    【Linux】进程控制

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

    19730

    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的时候,调用这个系统调用的时候,也就不返回,默认叫做阻塞状态 ——>通过这个我们可以知道阻塞不仅仅只是发生在向硬件发送请求时等待他的状态准备好

    15310

    wait和waitpid

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

    8110

    Linux-进程控制

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

    10310

    【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,不予等待。

    6610

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

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

    14410

    【Linux】进程控制

    ; 其次,一个函数正常执行的情况下,函数 return 之前函数的主体功能肯定已经被执行完了;对于 fork 函数来说,fork 函数的作用是创建进程,所以 fork return 之前就已经创建了进程...另外,为什么 fork 给进程返回进程的 pid,而给进程返回0呢?...所以没有对子进程进行进程等待,所以进程变成僵尸状态 D;5s过后,进程使用 wait 系统调用对子进程进行进程等待,所以进程由僵尸状态变为彻底死亡状态。...waitpid 函数时,如果子进程没有退出进程就只能阻塞在 waitpid 函数,直到进程退出进程通过 waitpid 读取退出信息后才能接着执行后面的语句; 而非阻塞式等待则不同,...和 waitpid 系统调用进行进程等待; status 参数是一个输出型参数,进程通过 wait/waitpid 函数进程退出信息写入到 status 中; status 以位图方式存储,包括退出状态和退出信号

    4.1K00

    僵尸进程

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

    1.4K50

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

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

    14.8K30

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

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

    31710

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

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

    27010

    Linux进程控制

    这个之前用过: 然后来看看里面数字对应的错误信息 注意:如果程序异常退出码也无意义。 常见的退出方式 上面说了mian函数调用return就是进程退出。...进程等待 什么是进程等待,为什么进程等待 之前说过僵尸进程会导致内存泄漏,因为他的资源无法回收,所以就需要等待进程结束然后来保存资源给进程,通过获取进程退出信息知道是否成功退出。...WNOHANG: 若pid指定的进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该进程的ID。 NO1就进程是不是询问进程是否退出。...进程替换 之前说过创建进程的目的是让进程去帮忙“做事”,可是为什么要去让进程帮忙做事呢? 首先说目的: 1.想让进程执行进程磁盘代码其中的一部分。 2.想让进程执行一个全新的程序。...调用exec函数之后会将自己的参数等等传给main函数,这就是为什么之前说main函数有三个参数,谁传给他的。

    2.9K00

    【Linux】Linux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

    进程28111先打印before消息,然后它有打印after。另一个after消息有28112打印的。注意到进程28112没有打印before,为什么呢?...如,进程运行完成,结果对还是不对,或者是否正常退出 进程通过进程等待的方式,回收进程资源,获取进程退出信息 3.2 进程等待的方法 3.2.1 wait方法 #include<sys/types.h...); 返回值: 当正常返回的时候waitpid返回收集到的进程进程ID; 如果设置了选项WNOHANG,而调用中waitpid发现没有退出进程可收集,则返回0; 如果调用中出错,则返回-...(查看进程退出码) options: WNOHANG: 若pid指定的进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该进 程的ID。...如果子进程已经退出调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得进程退出信息 如果在任意时刻调用wait/waitpid,进程存在且正常运行,则进程可能阻塞

    15310

    【Linux】探索进程控制奥秘,解锁高效实战技巧

    pid 1.5.写时拷贝: 为什么要用拷贝的形式,进程直接将资源给进程不就行了吗?...进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程进程派给进程的任务完成的如何,我们需要知道。...进程通过进程等待的方式,回收进程资源,获取进程退出信息 3.2wait()和waitpid()函数 wait pid_t wait(int* status); 功能: 等待任意一个进程结束...返回值: 调用成功,返回收集到的进程的PID,同时获取到了进程退出状态码;调用失败,返回-1,并设置错误码以指示错误的原因;如果为非阻塞等待,waitpid调用成功且没有收集到已结束的进程,则返回...我们不一定要让一个进程直接进行替换,可以创建进程,让进程进行替换,让进程等待我们的结果就可以. 4.4替换为什么没有影响进程

    4910
    领券