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

当第一个子进程退出,然后父进程没有调用wait就退出时会发生什么?

当第一个子进程退出,而父进程没有调用wait函数来等待子进程结束时,子进程会变成一个僵尸进程。僵尸进程是指子进程已经退出,但是父进程还没有来得及处理子进程的退出状态信息。此时,子进程的进程表项仍然存在,但是已经没有执行代码的能力。

僵尸进程的存在不会对系统造成直接的影响,但是如果父进程长时间不处理僵尸进程,会导致系统中积累大量的僵尸进程,占用系统资源。因此,及时处理僵尸进程是很重要的。

解决僵尸进程的方法有两种:

  1. 父进程调用wait或waitpid函数来等待子进程结束,并获取子进程的退出状态信息。这样子进程的资源会被释放,不再是僵尸进程。
  2. 父进程忽略SIGCHLD信号,由操作系统自动回收子进程资源。这种方式下,操作系统会在子进程退出时自动向父进程发送SIGCHLD信号,父进程可以通过信号处理函数来处理该信号,实现自动回收子进程资源的功能。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云容器服务(TKE):提供高度可扩展的容器化应用管理平台,简化容器部署和管理。产品介绍链接
  • 腾讯云数据库(TencentDB):提供多种数据库产品,包括关系型数据库、NoSQL数据库等,满足不同业务场景的需求。产品介绍链接
  • 腾讯云CDN(Content Delivery Network):提供全球加速服务,加速内容分发,提升用户访问体验。产品介绍链接
  • 腾讯云人工智能(AI):提供多种人工智能服务,包括图像识别、语音识别、自然语言处理等,帮助开发者构建智能应用。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

僵尸进程与孤儿进程

一个进程调用 exit 命令结束自己的生命时,其实它并没有真正的被销毁,内核只是释放了该进程的所有资源,包括打开的文件、占用的内存等,但是留下一个称为僵尸进程的数据结构,这个结构保留了一定的信息(包括进程号...这样设计的目的主要是保证只要父进程想知道子进程结束时的状态信息,就可以得到 僵尸进程: 一个进程使用 fork 创建子进程,如果子进程退出,而父进程没有调用 wait 或 waitpid 获取子进程的状态信息...这样,一个孤儿进程凄凉地结束了其生命周期的时候,init 进程就会出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。...解决僵尸进程方案 (1)方案一: 父进程通过 wait 和 waitpid 等函数等待子进程结束,但这会导致父进程挂起,所以这并不是一个好办法,父进程如果不能和子进程并发执行的话,那我们创建子进程的意义没有...同时一个 wait 只能解决一个子进程,如果有多个子进程就要用到多个 wait (2)方案二:通过信号机制: 子进程退出时,向父进程发送 SIGCHILD 信号,父进程处理 SIGCHILD 信号,在信号处理函数中调用

28050

wait和waitpid

1. wait() 函数 wait() 会阻塞调用进程,直到一个子进程终止。...); } else if (pid == 0) { // 使用 WNOHANG 时,可以处理没有进程退出的情况 printf("No child has exited yet....它们主要用于进程管理和控制,是系统编程中非常重要的工具  1:是什么 2:为什么也就是必要性 之前说过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。...for循环后,经过fork创建了一个子进程进入了RunChild,然后执行完RunChild后,exit(0),退出进程了,然后父进程再次进入循环,再次创建一个子进。。。。。。...以此类推 一个wait等待任意一个,10个子进程要用循环了,wait回收僵尸进程(父进程等待是必须的,意思是需要等子进程结束后父进程再进行回收)(wait返回的是回收子进程的PID) 如果子进程一直不死

8110
  • UNIX(进程间通信):04---孤儿进程

    个子进程还在执行时,它的父进程已经退出了,那么这个子进程退出信息也没有被父进程接收到,如果子进程退出信息没有被别的进程接收到,那么这个子进程就会变成一个僵尸进程,所以孤儿进程可能会引发僵尸进程。...我们这里再重温下僵尸进程和孤儿进程: 僵尸进程: 一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或waitpid获取子进程的状态信息,那么子进程进程描述符仍然保存在系统中。...孤儿进程没有进程进程,孤儿进程这个重任落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。...这样,一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。 如何创建孤儿进程?...执行结果:(我们可以发现5秒之后子进程的父进程变为1号进程,说明5秒之后父进程退出后,子进程被1号进程领养)

    62011

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

    进程创建子进程时会发生写时拷贝,写时拷贝会把大部分映射条目的权限都由‘rw’设置成‘r’。...调用函数我们通常想看到两种结果,一是函数的执行结果(比如说fopen打开文件,打开成功返回文件指针,打开失败返回NULL,这叫函数的执行结果),二是函数的执行情况(比如说同样是fopen打开文件,我们函数的执行情况对应的数字会被保存在...在我们的代码进程中,在任意地方调用exit都表示进程退出。...调用wait函数父进程默认进行阻塞等待,会等待任意一个子进程退出。等待成功,wait会返回子进程的pid,等待失败返回小于0的值。 ...fork之后父进程谁先运行不确定,但fork之后一定是父进程退出,因为父进程要回收子进程

    27010

    Linux僵尸进程以及wait函数

    一旦它的父进程是一个循环,不会结束(父进程不去调用wait函数或者waitpid函数)。那么子进程将会一直保持僵尸状态。那么它将一直占用进程号,系统没法回收利用。...而个子进程结束的时候(调用exit命令结束),其实他并没有真正的被销毁,而是留下一个僵尸进程的。...进程结束之后会发出SIGCHLD信号,然后父进程会收到该信号,可以在信号处理函数中使用wait函数来回收子进程。...参数是接收子进程退出状态,返回值是子进程的PID,出错为-1。 如果父进程有多个子进程,那么其中某一个子进程终止的时候,wait函数就会立即回收该子进程,并且返回。...他为0时,和wait()一样,阻塞父进程,等待子进程退出他取值为WNOHANG时,如果没有已经结束的子进程则马上返回,返回值为0。最常用的就是这两个。

    1.7K10

    通过linux0.11理解僵尸进程

    task[i]->father = 1; /* 父进程没有wait,子进程退出了,然后父进程退出了。...4 给父进程发SIGCHLD信号。 5 重新调度。因为自己退出了。 我们可以知道,一个进程调用exit的时候,他已经成为僵尸进程了。这时候如果父进程不处理这个事情,则退出的子进程会一直占据pcb。...我们看到如果父进程调用waitpid函数,会遍历子进程进程是TASK_ZOMBIE状态(即退出了),父进程会保存子进程退出码和把子进程运行的时间累加到自己的时间里。最后调用release函数。...// 子进程的新父进程进程id为1的进程 task[i]->father = 1; /* 父进程没有wait,子进程退出了,然后父进程退出了...wait即等待任意一个子进程退出。 while (pid != wait(&i)

    2K20

    Linux之进程控制

    一.进程创建(再谈fork) 一个程序被加载到内存中以后,这个程序变成了一个进程。...父进程创建一个子进程是为了让它帮我们去执行某一项操作,进程将这个操作执行完毕以后会将退出结果保存在PCB中。...return 0; } 这个代码的结果应该是:刚开始有两个运行状态的进程,大概五秒以后子进程结束,但父进程没有去回收,子进程处于僵尸状态,又过来五秒,父进程调用wait系统调用回收子进程,子进程被回收...,只剩下父进程,保持三秒后父进程也结束 ---- 2.waitpid 同样是父进程用于回收子进程的系统调用,但这个系统调用还能顺便拿到子进程退出时的退出码和信号。...5.图解父进程等待子进程 进程等待的本质是父进程检测子进程退出信息,这个退出信息保存到status中供父进程读取 四.进程替换 1.什么进程替换 进程替换就是在这个进程中通过调用exec*系列的函数

    81910

    Linux系统-进程控制

    0,对父进程返回子进程的pid 写时拷贝 概念: fork成功之后父子代码共享,父子不写入数据时,数据也是共享的,任意一方试图写入,便以写时拷贝的方式各自一份副本 为什么数据要进行写时拷贝...,但这并不代表代码不能进行写时拷贝,例如在进行进程替换的时候,则需要进行代码的写时拷贝 示图: fork函数为什么要给子进程返回0,给父进程返回子进程的PID: 一个父进程可以创建多个子进程,而一个子进程只能有一个父进程...二、进程终止 1、退出码 概念: 其实main函数是间接性被操作系统所调用的,main函数调用结束后就应该给操作系统返回相应的退出信息,而这个所谓的退出信息就是以退出码的形式作为main函数的返回值返回...向进程发生信号 如在进程运行过程中向进程发生kill -9信号使得进程异常退出,或是使用Ctrl+C迫使进程退出 代码运行异常 如代码当中存在野指针问题等bug问题使得进程运行时异常退出 3...三、进程等待 进程等待必要性: 进程退出,并不是完全退出,子进程的PCB任存在,父进程如果不等待回收,就可能造成‘僵尸进程’的问题,进而造成内存泄漏 注:进程一旦变成僵尸状态,并不能被父进程

    1.5K30

    教你写一个守护进程

    编写守护进程程序 创建子进程、终止父进程。父进程调用 fork()创建子进程,然后父进程使用 exit()退出,这样做实现了下面几点。...在调用 fork 函数时,子进程继承了父进程的会话、进程组、控制终端等,虽然父进程退出了,但原先的会话期、进程组、控制终端等并没有改变,因此,那还不是真正意义上使两者独立开来。...处理 SIGCHLD 信号不是必须的,但对于某些进程,特别是并发服务器进程往往是特别重要的,服务器进程在接收到客户端请求时会创建子进程去处理该请求,如果子进程结束之后,父进程没有wait 回收子进程...,则子进程将成为僵尸进程;如果父进程 wait 等待子进程退出,将又会增加父进程的负担、也就是增加服务器的负担,影响服务器进程的并发性能,在 Linux 下,可以将 SIGCHLD 信号的处理方式设置为...,自 是看不到输出信息。

    1.5K30

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

    因为一旦异常了,一般代码都没跑完,即使跑完了,错误码也不能让人相信,此时退出没有意义了!      ...所以,父进程需要关心子进程什么异常,以及发生何种异常,系统会通过信号来告诉我们的进程发生了异常!! ...所以我们最关键的是要看父进程是否收到了信号,如果没有收到没有异常(具体如何收到,涉及到进程等待的知识) 三、 进程等待 3.1 如何理解 3.1.1 是什么 通过系统调用接口wait/waitpid...——>(1)子进程的代码是否异常??(2)没有异常,结果对吗,不对的原因是什么?  问题2:父进程什么不定义全局变量的status,而必须用wait等系统调用来获取状态呢??...3.2.2 阻塞和非阻塞轮询  如果子进程一直不退出,父进程默认在wait的时候,调用这个系统调用的时候,也就不返回,默认叫做阻塞状态 ——>通过这个我们可以知道阻塞不仅仅只是发生在向硬件发送请求时等待他的状态准备好

    15310

    【Linux】进程控制

    写时拷贝 我们知道,进程创建子进程后,操作系统会将父进程的 pcb、进程地址空间、页表等拷贝一份给子进程;那么进程想要修改数据的时候,我们知道会发生写时拷贝,那么操作系统怎么会知道什么时候进行写入拷贝呢...系统调用wait 的作用是等待父进程的任意一个子进程退出。...那么在子进程运行期间,父进程没有调用 wait 呢?父进程在干什么呢?...这就是为什么我们将子进程退出码设为 10,但是 status 整体打印出来是 2560 的原因了,我们可以按照上面的原理分析一下,因为我们上面的代码是正常退出的,并没有被信号所杀,所以按照第一种情况分析...因为进程在调度运行的时候是没有规律的,完全由操作系统决定。 最后,为什么我们不用全局变量获取子进程退出信息,而是用系统调用呢?原因是因为进程之间具有独立性,父进程是无法直接获取子进程退出信息!

    13310

    Linux下的SIGCHLD信号

    对于父子进程来说,父进程可以通过wait或这waitpid函数来释放子进程的资源,也可以通过waitpid获得子进程退出状态。那么这个实现过程是通过阻塞等待,或者不断的轮询。...也就是进程结束的时候通过SIGCHLD信号告诉父进程,然后父进程再去释放其资源,如果没有收到该信号也不影响父进程的运行。        ...首先我们需要考虑,当我们创建子进程的时候,如果父进程没有定义捕捉函数子进程结束了,那么这个子进程变为了僵尸进程,所以在定义捕捉函数之前需要先将SIGCHLD信号进行阻塞,在定义捕捉函数后再去UNBLOCK...还有需要注意的是因为SIGCHLD不能叠加,所以如果多个子进程结束了也只有一个SIGCHLD,那么对于这种情况我们在捕捉函数中使用循环来处理多个子进程结束的情况,下面直接看代码吧: #include...所以循环wait */ while((pid = waitpid(0, &status, WNOHANG)) > 0){ if (WIFEXITED(status)) // 判断子进程退出状态

    4.6K10

    Linux系统之进程状态

    这些进程的task_struct结构(进程控制块)被放入对应事件的等待队列中。这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。...父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程退出,并获取它的退出信息(保存在task_struct里)。...父/子进程在不同时间点退出时,就可能会出现Z的细分状态: 僵尸状态 一个进程使用 fork 创建子进程,如果子进程退出后父进程没有调用 wait 或 waitpid 获取子进程的状态信息,并将子进程释放掉...出现僵尸状态可能有两种情况: 第一种情况,父进程收到通知还没来得及完成收尸,此时正常; 第二种情况,父进程收尸出现异常,此时,只要父进程退出,子进程的僵尸状态一直存在,可以通过杀死父进程或者重启来解决...孤儿状态 父进程退出,相应的一个或多个子进程还在运行,那么那些子进程将处于孤儿状态,成为孤儿进程。这些进程会被托管给别的进程,托管给谁呢?

    10.2K41

    和老李一起搞山寨Workerman(三)

    php /* 子进程在10s后退出退出后父进程已然还在运行中 但是父进程尚未做任何工作 所以按照定义,子进程将会成为僵尸进程. */ $i_pid = pcntl_fork(); if ( 0...两个函数同时出现的时候,可考虑通过对比方式使得记忆更加深刻。 下面的程式向我们表述了[ 一个生命周期为10s中的子进程在结束后被主进程通过pcntl_wait()回收 ]的简要流程: <?...,以类pcntl_wait( $status )的方式发起调用则程式必为之所阻塞,一直到子进程结束该函数则会返回;如我们将WNOHANG作为作为$option传入,程序则不会被阻塞。...pcntl_wifstopped:此君用于检测子进程是否已停止(注意停止不是终止,诸君要理解为临时挂起),需使用了WUNTRACED作为$option的pcntl_waitpid()函数调用产生的status...只是有些复杂: <-1:等待任意进程组ID等于参数pid给定值的绝对值的进程 =-1:等待任意子进程;与pcntl_wait函数行为一致 =0:等待任意与调用进程组ID相同的子进程 >0:等待进程号等于参数

    1.1K61

    Linux 僵尸进程产生原因及解决方法

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态。例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止。...僵尸进程是如何产生的 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,那么他将变成一个僵尸进程。通过ps命令查看其带有defunct的标志。...此时子进程已经退出,但是父进程没有退出没有通过 wait() 调用处理子进程。我们使用 ps 命令查看进程的状态: ?...上图红框中的大写字母 “Z” 说明 PID 为 112712 的进程此时处于僵死的状态。 让我们接着往下看!在结束 sleep 后父进程退出。...如果进程调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程

    11.8K21

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

    一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程。...方框中第一个echo ?执行的命令是查看process的退出码,第二个echo ?查看的是第一个echo ?的退出码,虽然echo是一个内建命令,但是也是当做进程来看待。...父进程不被调度,在执行wait发现子进程没有退出,父进程就不要调度,实际上就是将父进程PCB列入等待队列,处于S状态(非运行状态),等到子进程退出,唤醒父进程。...waitpid返回收集到的子进程进程ID; 如果设置了选项WNOHANG,而调用中waitpid发现没有退出的子进程可收集,则返回0; 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在...与wait等效。 pid_t rid=waitpid(-1,NULL,0);等待任何一个子进程退出,哪一个进程退了,对应返回哪一个进程的pid。

    14410

    Linux:进程地址空间、进程控制(一.进程创建、进程终止、进程等待)

    函数或系统调用发生错误时,errno会被设置为相应的错误码,以便程序可以根据错误码进行适当的错误处理。...如,子进程运行完成,结果对还是不对, 或者是否正常退出 为了回收子进程的资源并获取其退出信息,父进程需要调用wait()或waitpid()系统调用(进行进程等待)。...这些调用会阻塞父进程,直到有子进程退出,并返回已退出进程的PID和退出状态 5.2进程等待的方法 5.2.1 wait()方法 wait 方法在Linux 编程中是一个重要的系统调用,它主要用于监视先前启动的进程...10秒后父进程开始回收 10~15秒:父进程正常运行,15秒后父进程结束 5.2.2waitpid()方法 waitpid 是 Unix 和 Linux 系统编程中用于等待子进程结束并获取其状态的系统调用...如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在 参数 pid: Pid=-1,等待任一个子进程。与wait等效。

    13000

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

    僵尸进程的数据和代码资源被操作系统释放了,但是进程的PCB是没有释放的,依旧保留在操作系统里面,例如子进程退出码和进程终止信号都会被保存到它的PCB当中,进程调用系统调用waitpid的时候,子进程...进程等待的本质就是检测子进程退出信息,然后父进程将子进程退出信息(退出码和终止信号等)通过status变量获取,也就是通过waitpid或wait等系统调用获取。...进程没有死的时候,也就是没有退出的时候,父进程调用wait或waitpit需要等待子进程退出,系统调用接口也不返回,这段时间父进程什么都没做,一直等待子进程退出,这样的等待方式,称之为阻塞式等待...如果等待的子进程状态没有发生变化,则waitpid会返回0值。多次非阻塞等待子进程,直到子进程退出,这样的等待方式又称之为轮询。如果等待的进程不是当前父进程的子进程,则waitpid会调用失败。...答案:没有必要,因为exec系列函数调用结束之后,代码全都被替换了,就算给你返回值你也使用不了,因为代码全都替换为指定程序的代码了,所以只要exec系列函数返回,那就一定发生调用错误了。

    14.8K30

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

    而由于子进程多,父进程想具体调用某一个子进程时就需要这个子进程得有一个名字才能调用个子进程,因此给父进程返回对应子进程的pid。 3....5秒,子进程变成了Z+状态,进程执行时,通过调用wait将子进程回收,子进程结束了,最后的5秒只剩下父进程处于S+状态。...因此打电话相当于系统调用wait/waitpid,张三相当于父进程,李四相当于子进程。...而exec系列的函数调用成功是没有返回值的,也不需要返回值,因为进程被替换之候原本的代码没有意义了,即便返回了一个值,也不会有什么作用,还会有额外的开销。...、页表,与父进程共享对应的物理内存: 而进程调用execl时,由于子进程发生改变,本着进程直之间具有独立性的原则,子进程就会发生写时拷贝,将共享的数据段和代码段在物理内存的另一个位置进行写时拷贝,

    6.2K00
    领券