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

为什么主进程和子进程在main异常后不退出?

主进程和子进程在main异常后不退出的原因是为了保证程序的稳定性和可靠性。

  1. 程序容错能力:在程序运行过程中,可能会出现各种异常情况,例如网络异常、内存溢出、代码逻辑错误等。如果主进程或子进程在遇到异常后立即退出,可能会导致整个程序的停止,影响用户体验和系统正常运行。为了保证程序的容错能力,主进程和子进程通常会对异常进行捕获和处理,然后继续执行程序的其他逻辑,或者进行一些清理工作。
  2. 资源回收:程序运行过程中会涉及到各种资源的申请和释放,例如打开文件、建立网络连接、申请内存等。如果主进程或子进程在异常发生后立即退出,可能会导致这些资源没有得到正确释放,从而产生资源泄漏和系统资源的浪费。为了避免这种情况的发生,主进程和子进程通常会在异常发生后进行资源的清理和回收工作,然后再退出程序。
  3. 异常日志记录和问题排查:异常是程序运行过程中的重要信息,记录和分析异常可以帮助开发人员快速定位和解决问题。如果主进程或子进程在遇到异常后立即退出,就无法获得完整的异常信息。为了方便问题排查和调试,主进程和子进程通常会捕获异常,并将异常信息记录到日志中,以便后续分析和处理。

总之,主进程和子进程在main异常后不退出是为了保证程序的稳定性、可靠性和可维护性。它们会对异常进行捕获和处理,进行资源清理,记录异常日志,以确保程序能够继续执行或正确退出。腾讯云相关产品和产品介绍链接地址:腾讯云产品

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

相关·内容

【Linux】进程控制

所以说进程异常,本质是因为进程收到了OS发给进程的信号。 所以如果进程异常了,我们可以通过退出信号,就可以判断进程为什么异常了,此时的退出码是无意义的。...在用户层面上,要确定进程是什么情况: 先确认是否异常 如果不是异常,就一定是代码跑完了,看退出码即可。 衡量一个进程退出,只需要两个数字:退出退出信号。...进程常见退出方法 正常终止: main函数return,表示进程终止(非main函数的return,都只是表示函数结束) 调用exit函数 注意:代码的任意位置调用exit,都表示进程退出 _exit...进程运行五秒后退出,此时由于父进程还在休眠无法回收,所以进程就变成Z状态,再过五秒进程就被父进程回收了。...(查看进程退出码) 非阻塞等待 我们用的大部分接口都是阻塞等待接口,阻塞等待时,父进程干不了别的事,一直等待进程退出。下面介绍非阻塞等待。

10810
  • Linux之进程控制

    fork,有两个执行流,父子进程是共享的,所以return会被父子进程各自调度一次,也就是调度两次。 为什么给父进程返回进程的pid,给进程返回0呢?...2.进程退出的方法 从函数(main函数)return返回; 程序的任意位置调用exit(code); 系统调用_exit(code); 3....为了避免这种情况,为了让父进程知道子进程的任务完成的怎么样,我们需要让父进程通过进程等待的方式,回收进程退出的资源。...进程等待的信息存在哪里 进程进程都有各自对应PCB,当进程退出且父进程未回收进程资源时,进程退出信息以及进程的资源信息都保存在进程的PCB中。...补充 对于获取进程退出结果,我们可以采用对输出型参数进行位操作,因为Linux提供了对应操作的宏。

    18820

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

    注意:进程调用fork,当控制转移到内核中的fork代码,内核做以下工作: 分配新的内存块内核数据结构给进程 将父进程部分数据结构内容拷贝至进程进程:内核的相关数据管理的数据结构(task_struct...一旦出现异常退出码就没有意义了!!! 为什么异常才是最重要的!!! 那为什么会出现异常呢??? 原因是:进程出现异常的本质是进程收到来自OS发给进程的信号!...查看进程退出码): 从main函数return,表示进程终止 调用exit _exit 异常退出: ctrl + c,信号终止 来看手册中如何描述的: 调用exit 函数试试: 1 #include...父进程通过进程等待的方式,回收进程资源,获取进程退出信息 也就是说,任何进程退出时都要被父进程进行等待,不然进程处于僵尸进程就会造成内存泄漏!!!...,并且会存在一段时间的窗口期,此时进程处于僵尸进程: 在这个父进程等待的过程中,父进程一直等待进程退出,处于阻塞等待状态。

    9910

    Linux进程控制

    例如进程从fork返回,调用exec函数 fork失败原因 系统中有太多的进程 实际用户的进程数超过了限制 进程退出 1.退出码 我们写C/C++代码时,总喜欢main函数最后return...为什么总是返回0呢? 这里返回的0系统中我们称为进程退出时的退出码,可以用来标定我们进程退出时的结果是否正确。 我们写代码是为了完成翁某项事请,那么我们怎么知道任务完成的如何呢?...进程退出的场景: 代码运行完毕,结果正确 代码运行完毕,结果不正确 代码异常终止 进程终止常见方法: 正常退出,可以命令行中使用echo $?...查询退出码 从main函数中返回 在任何地方调用exit 在任何地址调用_exit 异常退出 使用Ctrl+Z组合键,终止进程 使用kill -9 命令杀死进程 exit函数 头文件:stdlib.h...exit函数结束进程,删除进程使用的内存空间,并将进程的状态返回给操作系统(一般是用0表示正常终止,非0表示异常终止);return是结束函数的执行,将函数的执行信息传其他调用函数使用 非函数中调用exit

    9410

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

    一.进程创建 fork函数创建进程,新进程进程,原进程为父进程; fork函数包含在头文件 进程调用fork,当控制转移到内核中的fork代码,内核做: 分配新的内存块内核数据结构给进程...进程是否是异常退出 没有异常;如果有,可以通过查看错误码来查看错误信息 可以通过查看退出码,来知晓进程退出情况  可以用以下命令查看最后一次进程退出退出码 echo $?  ...exit_exit exit _exit 都可以退出进程,但是exit退出进程前会做其它工作:  执行用户通过 atexit或on_exit定义的清理函数。...等待的原理: 其实进程退出的时候,会把退出码,终止信号写入到PCB的 exit_code    exit_signal 变量中,等待进程时,也就是从子进程的PCB中读取这两个变量的值,并写入到输出型变量...即在进程退出前,父进程什么也不做,一直等着进程退出,此时父进程处于阻塞状态。

    28310

    Linux系统-进程控制

    > fork成功对子进程返回0,对父进程返回进程id,fork出错返回-1 内核视角看待fork: 进程调用fork,内核分配新的内存块内核数据结构给进程 将父进程部分数据结构内容拷贝至进程...0,对父进程返回进程的pid 写时拷贝 概念: fork成功之后父子代码共享,当父子写入数据时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本 为什么数据要进行写时拷贝...: 进程具有独立性,多进程运行,需要独享各种资源,多进程运行期间互不干扰,不能让进程的修改影响到父进程 为什么不在创建进程的时候就进行数据的拷贝: 进程不一定会使用父进程的所有数据,并且进程不对数据进行写入的情况下...二、进程终止 1、退出码 概念: 其实main函数是间接性被操作系统所调用的,当main函数调用结束就应该给操作系统返回相应的退出信息,而这个所谓的退出信息就是以退出码的形式作为main函数的返回值返回...,并非清空数据代码,而是将对应内存区域设置为无效,要再次使用时直接覆盖数据代码就行了 取消曾经该进程进程队列里的链接关系(避免”野指针“) 三、进程等待 进程等待必要性: 当进程退出

    1.5K30

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

    例如进程从fork返回,调用exec函数 2.进程终止 2.1.进程退出场景 进程代码运行完毕,结果正确 进程代码运行完毕,结果不正确 进程代码没用执行完,进程异常了 2.2.进程常见退出方法 正常终止..._exit 异常退出: ctrl + c,信号终止 2.3.exit()函数_exit()函数辨析 exit函数会支持刷新缓冲区,_exit函数不支持。...进程如果在执行的时候异常了,os会发送信号终止它,这个就是退出信号。非0就代表程序出异常,0代表程序正常执行。...进程一旦变成僵尸状态,那就刀枪不入,“杀人眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。 父进程派给进程的任务完成的如何,我们需要知道。...3.3阻塞等待非阻塞等待 3.3.1、阻塞等待 定义:进程发出某个请求(如:I/O操作、等待某个条件成立等),如果请求不能立即得到满足(如:数据未准备好、资源被占用等),进程会被挂起,在此期间无法继续执行其他任务

    4810

    【Linux】进程控制

    进程调用 fork,控制转移到内核中的 fork 代码,内核应该做: 分配新的内存块(pcb)内核数据结构(进程地址空间、页表等)给进程 将父进程部分数据结构内容拷贝至进程进程添加到系统进程列表当中...fork 返回,开始调度器调度 当父进程创建进程,fork 之后父子进程代码共享,可以使用 if else 进行分流,让进程进程执行不同的任务。...可以结合下图进行理解: 进程修改内容前: 进程修改内容写时拷贝完成,操作系统会将对应修改内容的页表中的访问权限字段修改成读写(rw),所以说,进程没有进行写入的时候,页表中的访问权限字段都是只读...因为进程调度运行的时候是没有规律的,完全由操作系统决定。 最后,为什么我们不用全局变量获取进程退出信息,而是用系统调用呢?原因是因为进程之间具有独立性,父进程是无法直接获取进程退出信息!...当父进程创建进程,父子进程共享代码和数据,但是当进程进行程序替换的时候,物理内存的数据代码会被修改覆盖,所以这时候会影响父进程,所以这时候会发生写时拷贝,将数据代码拷贝一份给进程,将进程的数据代码替换即可

    13310

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

    进程中也有相关管理数据结构也有自己的代码和数据,代码和数据虽然进程共享,但是进程相互不影响,数据的部分是以写时拷贝时私有,写时拷贝相当于共享。...fork函数返回值 进程返回0 父进程返回的是进程的pid 如何做到有两个返回值? 探索父进程进程 文章中有详细解释。 为什么给父进程返回的是进程的pid,给进程返回0?...进程退出时,我们可以看进程退出信号是多少来判断进程为什么异常。...进程等待 概述 什么是进程等待? 任何进程退出的情况下,一般必须要被父进程等待。 进程退出的时候,如果父进程不管不顾,退出进程,处于僵尸状态(Z),存在内存泄漏。 为什么?...由此可以看出,等待会解决进程的僵尸问题。 将上述代码sleep(10)代码注释掉,进程运行5秒直接退出,立马执行父进程等待。如果子进程没有退,其实父进程一直阻塞等待。

    13610

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

    2.2.2 退出码概念 父进程可以通过拿到进程退出码,不同的退出码分别代表的是不同的原因!! 问题1:为什么需要有退出码呢??...库函数函数exit  exitreturn的区别:returnexitmain函数里是等价的,因为exit表示退出进程,而main函数恰好执行完return也会退出进程,但是return在其他函数中代表的是函数返回...所以进程结束应该优先判断该进程是否异常了,然后才能确定退出码能不能用!!   ...所以,父进程需要关心子进程为什么异常,以及发生何种异常,系统会通过信号来告诉我们的进程发生了异常!! ...——>(1)进程的代码是否异常??(2)没有异常,结果对吗,不对的原因是什么?  问题2:父进程为什么不定义全局变量的status,而必须用wait等系统调用来获取状态呢??

    13110

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

    #include pid_t fork(void); 返回值:自进程中返回0,父进程返回进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码,内核做: 分配新的内存块内核数据结构给进程...例如进程从fork返回,调用exec函数。...代码异常终止时,看退出信号; 所以衡量一个进程退出,我们只需要关注退出码(告诉父进程退出信号(os发出信号)。...查看进程退出码) 从main返回 调用exit _exit 异常退出 ctrl + c,信号终止 ✨_exit()函数 #include void...⭐进程等待 进程等待的必要性 Linux进程提到过,进程退出,父进程如果不管不顾,不读取进程退出信息,就可能造成“僵尸进程”的问题,进而造成内存泄漏。

    10810

    【Linux】进程控制

    2、2、进程终止的3种情况 先问一个问题: 为什么之前我们写程序的时候main函数的返回都是0呢?返回0会有什么结果吗?...如果错误的话能够看退出码来判断是什么样的错误。 如果是异常退出的话,退出码就失去了效果,不能够起到相应的作用。 为什么出现了异常?...当是异常的时候,我们可以看退出信号是多少我们就能够判断我们的进程为什么异常了。所以这个信号也就像类似于之前的退出码,有异曲同工的妙处。...为什么进程会在结束之后变为Z状态还保留了本身的数据结构,就是为了保住其中的进程退出的两个数,让父进程读取之后判断是否异常。...2、4、如何终止 1、main函数return,表示进程终止(非main函数,return,函数结束) 2、代码调用exit函数(注意:代码的任意位置调用exit,都表示进程终止) 3、_exit—system

    6610

    Linux进程控制

    进程终止 退出写C/C++的时候,我们main函数是程序的开始,但是最后一个位置会写return 0; 这也就代表一个程序的退出,至于为什么要写return 0,而不是返回其他的,亦或者是写都可以...这个之前用过: 然后来看看里面数字对应的错误信息 注意:如果程序异常退出码也无意义。 常见的退出方式 上面说了mian函数中调用return就是进程退出。...waitpid 举例之前首先说一下status: 一个程序终止有三种情况,代码运行完毕,结果正确不正确,还有没运行完,出异常了。...如果在询问之后进程没有准备完毕,父进程则可以做一些其他的事情。 至于非阻塞阻塞谁更好,这个要看实际场景。...调用exec函数之后会将自己的参数等等传给main函数,这就是为什么之前说main函数有三个参数,谁传给他的。

    2.9K00

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

    进程调用fork,当控制转移到内核中的fork代码,内核做: 分配新的内存块 task_struct、mm_struct等内核数据结构给进程 将父进程部分数据结构内容拷贝至进程 添加进程到系统进程列表当中...注意 return exit 区别 exit()函数return的功能差不多,但是exit()在任何的地方只要被调用,就会立即的退出进程 只有main()函数中return才会退出进程,而exit...status的16个比特位上,高8位表示进程退出的状态,即进程退出码。而后7位为进程终止的信号。第8个比特位是一个标志 注意:当进程正常退出的时候,不用查看退出信号。...(后面会有阻塞等待非阻塞等待的例子) 下面分别对阻塞等待非阻塞等待举出一个例子: 进程运行的时候,父进程干什么呢?...进程程序替换 5.1 替换原理 用fork创建进程执行的是进程相同的程序(但有可能执行不同的代码分支),进程往往要调用一种exec函数以执行另一个程序。

    800

    nginx源码阅读(5)Master进程浅析

    挂起进程 当做完上面2项准备工作,就会进入主循环。循环里面,master进程通过sigsuspend系统调用,等待着信号的到来,等待的过程中,进程一直处于挂起状态(S状态)。...,不受原来的master进程管理 unsigned exiting:1; //为1时表示正在主动退出,一般收到SIGQUIT或SIGTERM信号,会置该值为1,区别于进程异常被动退出...信号杀死master一般异常情况下使用,这里不算)。...对于场景23,master进程需要等到所有的进程退出退出(避免出现孤儿进程)。对于场景4,本小节先介绍,在后面会介绍binary升级。下面我们了解下master进程是如何实现前三个场景的。...即告诉循环,当前是否仍有存活的进程存在。循环里,当!

    1.8K21

    2.并发编程多编程

    这样虽然达到了目的, 1,但是你程序中故意加sleep极大影响程序的效率。 2,sleep(3)只是虚拟进程运行的时间,进程运行完毕的时间是固定的。...如果父进程能及时 处理,可能用ps命令就来不及看到进程的僵尸状态,但这并不等于进程不经过僵尸状态。 如果父进程进程结束之前退出,则进程将由init接管。...我们来测试一下(创建完进程,主进程所在的这个脚本就退出了,当父进程先于进程结束时,进程会被init收养,成为孤儿进程,而非僵尸进程),文件内容 import os import sys import...八 进程mutiprocess.Poll 为什么要有进程池?进程池的概念。   程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。...: 11852 #发现回调函数是进程中完成的,其实如果是进程中完成的,那我们直接将代码写在进程的任务函数func1里面就行了,对不对,这也是为什么称为回调函数的原因。

    1.2K20

    Linux进程控制——Linux进程终止

    进程终止 进程退出场景: 代码运行完毕,结果正确 代码运行完毕,结果不正确 代码异常终止 前面二者都是正常退出,而最后则是异常退出 2.1 main退出码 我们之前写代码中,main函数只能return...进程环境中,我们创建进程的目的就是协助父进程办事,但是父进程怎么知道子进程把事情办得怎么样?所以父进程要知道子进程办的怎么样,就有了退出码,而main函数的返回值,就是进程退出码!...int main() { return 31; } 我们执行完,这段代码,再用指令查看退出码 我们可以发现指令:echo $?...总结拓展 拓展:exit与_exit的区别 之前讲到正常退出时,我们有3种情况。 正常终止 从main返回 调用exit _exit 而exit与_exit两个有什么区别联系呢?...exit终止进程的时候,不会自动刷新缓冲区 总结 进程终止相对于其他的进程控制来说,是很好理解的。我们主要介绍了进程终止,明白错误码退出码之后,相信能理解父进程是怎么得到进程信息的。

    10410

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

    调用fork函数之后,当执行的程序代码转移到内核中的fork代码,内核需要分配新的内存块内核数据结构给进程,内核数据结构包括PCB、mm_struct页表,然后构建起映射关系,同时将父进程内核数据结构中的部分内容拷贝到进程...有的时候,我们main函数的时候,总是要写一个return 0,但是写这个return 0好像程序运行起来又没有什么错误,这是为什么呢?...0 — 退出码起作用,标识错误信息 代码没执行完毕,程序出现异常退出码无意义 以上就是进程退出的三种情况。 2. 进程退出的时候,可以从main函数return返回,以此结束进程。...可以利用位运算符来得到status的前7比特位8个比特位,以此来获取到进程退出信息,是异常终止呢?还是正常终止,结果出错,或结果正确呢?...下面是进程正常退出进程异常终止时,终止信号退出码的数值,我将退出码设置为10,用于检测status变量的正确性,另外当进程异常终止时,退出码失去意义,linux此时自动将退出码默认设置为0,但我们知道

    14.8K30

    聊一聊未捕获异常进程退出的关联

    之前的文章JVM 如何处理未捕获异常 我们介绍了JVM如何处理未捕获异常,今天我们研究一个更加有意思的问题,就是JVM中如果发生了未捕获异常,会导致JVM进程退出么。...主线程中制造未捕获异常 同时上面的场景,通用的JVMAndroid上表现有一些差异,我们也都会进行覆盖研究。...线程中的未捕获异常 我们使用下面的代码,模拟一个线程中出现未捕获异常的场景。...(应该是Thread-0)程因为NPE未捕获而导致线程销毁 主线程不受刚刚异常的影响(进程还存在),睡眠10秒,会打印出所有线程的信息(包含刚刚崩溃线程Thread-0的信息) //异常发生 输出线程名称发生异常的时间...那么这是为什么呢,看过我之前文章JVM 中的守护线程的朋友应该了解 JVM退出通常有两种情况 有效的调用System.exit() 所有的非守护线程退出,JVM就会自动退出 因此不难得出结论 第一段代码中

    1.4K10
    领券