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

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

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

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

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

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

相关·内容

Linux之进程控制

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

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

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

    9510

    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

    8810

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

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

    25810

    Linux系统-进程控制

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

    1.5K30

    【Linux】进程控制

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

    12810

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

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

    12910

    【Linux】进程控制

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

    6010

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

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

    9810

    Linux进程控制

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

    2.9K00

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

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

    1.7K21

    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终止进程的时候,不会自动刷新缓冲区 总结 进程终止相对于其他的进程控制来说,是很好理解的。我们主要介绍了进程终止,明白错误码退出码之后,相信能理解父进程是怎么得到进程信息的。

    9610

    【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.7K30

    exit(0)与exit(1),return三者区别(详解)

    exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序; return():返回函数,若在函数中,则会退出函数并返回一值。...非函数中调用returnexit效果很明显,但是main函数中调用returnexit的现象就很模糊,多数情况下现象都是一致的。...exit_exit 进程终止有5种方法: 1正常终止 (1)从main函数返回 (2)调用exit (3)调用_exit 2异常终止 (1)调用abort (2)由一个信号来终止  exit_exit...这两个函数会对父子进程有一定的影响,当用vfork创建进程时,进程会先在父进程的地址空间运行(这跟fork不一样),如果子进程调用了exit就会把父进程的IO给关掉。...这两个函数都带一个参数表示终止状态,这跟我们平时写的return效果是一样的,如果返回一个终止状态,那表示这个进程的终止状态就是未定义的。

    2.7K90

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

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

    1.3K10

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

    进程等待必要性 了解完进程等待的概念,新的问题出现了,我们为什么要进行进程等待,进程等待的必要性是什么?...通过这个视频我们又能发现两个进程一起运行,但是进程没有退出之前,父进程一直wait上等待,并且并没有出现进程僵尸状态而是直接回收了。...获取进程status 父进程想要知道子进程退出信息,也就是退出退出信号,就要用到输出型参数status waitwaitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充...而进程退出时,操作系统就会将退出信号退出码写到进程的PCD中 int exit_code; int exit_signal 而退出信号退出码将会写到这两个变量中, 当我们调用系统调用时,只需要将这两个变量组合写入到变量里...*statusp = (exit code<<8)| exit siganl 这样父进程就获取到了进程退出信息 拓展二:我们为什么不用全局变量获取进程退出信息而用系统调用?

    9110

    线程的概念及linux下线程库相关函数的使用

    1.1为什么要引入线程,线程相对于进程优势在哪里? 历史回顾:20世纪90年代,由于多处理系统的迅速发展。...正是由于进程切换时,操作系统的开销比较大。操作系统中所设置的进程数量不能过多,否则在一定程度上降低了操作系统的并发程度。...对比图 2.3线程结构 指令和数据来源于进程。 各类资源来源于进程。 相对于进程进程控制块线程有线程控制块:包含栈空间、寄存器集、程序计数器线程的ID。...//线程还没来得及执行,进程结束线程被迫结束 pthread_exit(NULL);//退出当前的线程,并没结束整个进程。...//只有当进程中所有线程执行完毕进程才会结束 return 0; } 没有添加单线程退出函数的结果: 和我们预期的结果是一致的。

    55430

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

    当控制转移到内核中的fork代码,内核做: 分配新的内存块内核数据结构给进程(内核数据结构:PCB地址空间+页表,构建对应的映射关系) 将父进程部分数据结构内容拷贝至进程 添加进程到系统进程列表当中...对于fork函数,当调用时,fork函数内部会有两个执行流,对应父进程进程,当fork函数内部代码执行完毕进程也就被创建好了并有可能在OS的运行队列中准备被调度了,父进程进程各自执行return...执行: 这样就能很好的观察终止信号进程退出码。 3.若代码没跑完结果异常了:(进程中添加一个错误) 不同的错误通过信号的值可找到对应的错误。...如果子进程异常了,那么父进程也能够抓到,为了演示这种情况我们进程中增加一个野指针的错误: 此时的退出码为0,代表的是进程退出码,而终止信号是11号错误,对于异常进程退出,他的退出码是没有意义的...问:对于execle函数main函数,进程调用的时候是谁先被调用呢? 我们之前的代码中,main函数通常是这样的参数:(VS上没有是因为编译器在编译时自动生成) 答:exec先被调用。

    6.2K00
    领券