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

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

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

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

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

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

相关·内容

【linux】进程创建与进程终止

,父进程获取到的是最近一个子进程退出的退出码,前面我们提到,echo是内建命令,打印的都是bash内部的变量数据 父进程bash为什么要得到子进程的退出码呢?...一旦出现异常,退出码没有意义了!进程出异常,本质是因为进程收到了OS发给进程的信号! 段错误,OS提前终止进程 我们可以看进程退出的时候,退出信号是多少,就可以判断我的进程为什么异常了! !...异常退出: ctrl + c,信号终止 在 Unix 和类 Unix 系统中,_exit() 和 exit() 都用于终止进程,但它们在功能和使用场景上有重要的区别。...使用场景主要是在创建子进程后,子进程完成任务立即退出时,或者在程序遇到无法恢复的错误需要立即终止时使用。 使用 exit() 当你需要正常终止程序,并且需要清理资源(如关闭文件、保存状态等)。...使用 _exit() 在需要快速退出且不关心资源清理的场景下,比如在子进程中执行了某个任务后,或者在出现严重错误时安全退出。 选择合适的函数可以避免数据丢失和资源泄漏,确保程序的稳定和安全。

10110
  • Linux系统编程:进程控制(创建,终止,等待)

    1.在fork返回之前,创建了子进程的 PCB数据结构,以及拷贝了一份父进程的地址空间和页表;此时页表是出于只读,一旦修改就会写实拷贝; 2.在修改之前,虚拟地址都是一样的,且映射的物理地址也是一样的;...查看上一个进程的退出码 1.在main函数中return 2.调用exit 3.调用_exit 2.2main函数返回值 main函数虽然是主函数,但毕竟也是个函数,最后的返回值即使告诉操作系统是否正常结束...退出码的作用就是告诉父进程,子进程的退出状态-是正常结束了还是出现错误终止了; 2.为什么要用退出码判断进程是否出错,直接printf不好吗?...,然后继续执行后序的代码,这个时候就需要等待子进程完成任务后,获取子进程的退出码看看他完成的怎么样了; 2.避免僵尸进程:子进程先父进程结束会出现僵尸状态,造成进程卡死,无法回收,所以我们只需要阻塞父进程让他等待子进程完成...调用函数,自己帮我们填充这个变量的; wait函数等待成功后,status就会获得该子进程的退出码; 为什么不使用全局变量来获取子进程的退出状态呢?

    10710

    Linux之进程控制

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

    19920

    【Linux】进程控制

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

    12110

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

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

    10910

    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

    9510

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

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

    33810

    详谈 Linux进程控制(看这一篇就够了)

    写时拷贝 通常,父子代码共享,父子在不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本,如下图: 所以数据不修改时,代码共享是因为子进程拷贝了父进程的mm_struct和页表,...进程终止 本质:释放系统资源, 就是释放进程申请的相关内核数据结构和对应的代码和数据。 ✨1. 进程退出的场景 代码运行完毕, 结果正确 代码运行完毕,结果不正确 代码异常终止 ✨2....2.4 缓冲区问题补充(为什么_exit不刷新缓冲区) exit属于是语言级别的,在三号手册, 而_exit是系统级别的,在二号手册。...waitpid的第二个参数,它会帮助父进程获取子进程的退出信息,通过参数的方式给我们带出来。输出型参数。 但是这里的退出信息却是256,为什么不是1呢?...替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用⼀种exec函数以执行另⼀个程序。

    12810

    Linux系统-进程控制

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

    1.5K30

    Linux进程控制

    非0返回值,通常用于表示不同类型错误/异常的原因,退出码的字符串含义取决于程序的设计者。 退出码:分为 0 和 !0 0:表示程序正常运行,进程执行成功。 !...0 进程没有正常运行,退出码没有任何意义 2.6.进程退出的方式 2.6.1.正常退出 就是在正常的程序代码中,如main函数走到结尾,或者是遇到return。这样的正常结束。...注:main函数返回、调用exit()、_exit()函数,都表示程序主动退出,即:正常终止;接受到信号(如:ctrl c,信号终止),表示程序被动退出,即:异常退出。...它们都是终止进程,但只有OS才有能力终止进程,因此exit()底层封装了_exit(),两者是上下层关系 为什么语言具有可移植性和跨平台性?...3.3.进程等待的两种方式:阻塞等待和非阻塞等待 3.3.1阻塞等待 定义:进程在发出某个请求(如:I/O操作、等待某个条件成立等)后,如果请求不能立即得到满足(如:数据未准备好、资源被占用等),进程会被挂起

    9610

    【Linux】深入理解进程控制:从创建到终止和进程等待

    进程创建 fork函数 fork 函数是 Unix/Linux 系统中用于创建新进程的系统调用。调用 fork 后,当前进程(父进程)会被复制,创建出一个新的进程(子进程)。...执行顺序: 父进程和子进程可以并发执行,执行顺序不固定,取决于操作系统的调度策略。...其基本原理是:在创建新进程时,父进程和子进程共享相同的内存页,直到其中一个进程尝试修改这些内存页时,系统才会为该进程创建一个独立的副本,从而避免不必要的内存复制,提高系统性能。...进程终止 进程终止的常用方法: 通过main函数return exit _exit 异常退出: Ctrl+c 信号终止 每个进程退出的时候都是有退出码的,我们来验证一下: 我们写一个简单的代码: #...进程等待 关于进程等待的三个函数,我们先从第一个函数说起: wait wait 函数在 Unix 和 Linux 系统中用于让父进程等待其子进程结束,并收集子进程的退出状态。

    17110

    【Linux】进程控制

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

    15010

    【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操作、等待某个条件成立等)后,如果请求不能立即得到满足(如:数据未准备好、资源被占用等),进程会被挂起,在此期间无法继续执行其他任务

    5110

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

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

    15910

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

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

    14410

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

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

    19710

    【Linux】进程控制

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

    7110

    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函数以执行另一个程序。

    38510
    领券