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

9210

Linux进程控制

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

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

    9810

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

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

    9510

    【Linux】进程控制

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

    19430

    Linux-进程控制

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

    9410

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

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

    12910

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

    6010

    僵尸进程

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

    1.4K50

    【Linux】进程控制

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

    4.1K00

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

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

    14.7K30

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

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

    24810

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

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

    26310

    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,进程存在且正常运行,则进程可能阻塞

    13710

    Linux进程控制

    1.问题 一 fork是操作系统创建进程函数函数return返回时,已经把创建进程该做的工作全部做完了(核心代码走就跑完了),也就是说:return返回之前进程已经被创建好了,所以此时会存在父子两个进程...例如进程从fork返回后,调用exec函数 fork失败原因 系统中有太多的进程 实际用户的进程数超过了限制 进程退出 1.退出码 我们写C/C++代码时,总喜欢main函数最后return...1.为什么要进行进程等待 之前讲过,进程退出进程如果不管不顾,就可能造成'僵尸进程'的问题,进而造成内存泄漏。...如果不存在该进程,则立即出错返回。 使用非阻塞等待的方式下: 如果等待的进程存在,但子进程没有退出调用wait/waitpid询问时会返回0。...如果等待的进程存在,并且进程刚好退出调用wait/waitpid询问时会返回进程退出信息,如:终止信号,退出码。 如果等待的进程不存在。调用wait/waitpid时会返回0。

    8810

    Linux系统-进程控制

    : 进程具有独立性,多进程运行,需要独享各种资源,多进程运行期间互不干扰,不能让进程的修改影响到进程 为什么不在创建进程的时候就进行数据的拷贝: 进程不一定会使用进程的所有数据,并且进程不对数据进行写入的情况下...,但这并不代表代码不能进行写时拷贝,例如在进行进程替换的时候,则需要进行代码的写时拷贝 示图: fork函数为什么要给进程返回0,给进程返回进程的PID: 一个进程可以创建多个子进程,而一个进程只能有一个进程...因此,对于进程来说,进程是不需要被标识的;而对于进程来说,进程是需要被标识的,因为进程创建进程的目的是让其执行任务的,进程只有知道了进程的PID才能很好的对该进程进行深入操作 为什么...,退出没有意义 进程常见退出方法: 1) 调用_exit函数 _exit函数原型: #include void _exit(int status); 注意: status...尽量使进程晚于进程退出,可以规范化进行资源的回收 注:所以一般来说,当我们fork之后,就需要进程等待回收进程 1、等待方法 wait方法: wait函数原型: #include<

    1.5K30

    【Linux】进程控制

    进程控制 一、进程创建 1. fork 函数创建进程 Linux 中 fork 函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程进程,而原进程进程。...其实操作系统进程创建进程之前,会将页表中的访问权限字段统一修改成只读,无论是地址空间中的哪个区域,都会改成只读,然后再创建进程,这是为什么呢?...系统调用wait 的作用是等待进程的任意一个进程退出。...那么进程运行期间,进程没有调用 wait 呢?进程干什么呢?...因为进程调度运行的时候是没有规律的,完全由操作系统决定。 最后,为什么我们不用全局变量获取进程退出信息,而是用系统调用呢?原因是因为进程之间具有独立性,进程是无法直接获取进程退出信息!

    12810

    Linux之进程控制

    前言 本文介绍了进程终止、进程等待、进程替换等进程控制的相关概念。 一、再识fork 我们之前的内容中已经了解过系统调用fork,今天我们再来深入了解一下fork。...四、进程等待 1.进程等待的场景 之前进程状态的时候,我们讲到一种特殊的转态:僵尸状态:进程退出进程没有等待进程没有回收进程的资源),会造成进程处于僵尸状态,造成内存泄漏,同时这种状态的进程无法被杀死...2.进程为什么要等待 1.进程通过进程等待的方式回收进程的资源; 2.进程要获取进程退出信息 3.进程等待的方式 wait **参数:**输出型参数,一般设置为status,用于获取进程退出状态...3.替换原理 为什么调用替换函数后,原程序的剩余部分不再执行?...用fork创建进程后,执行的可能是进程相同的进程(也可能执行与进程不同道德代码分支),进程往往会调用exec系列的函数以执行另一个程序。

    18520
    领券