• Linux学习之“exit函数”


    先看下"_exit"和"exit":

    exit被调用时,将冲刷所有的标准I/O流,关闭所有打开的文件描述符。在传统实现中,同时也将关闭标准I/O流。即表示标准输出FILE对象的相关存储区将被清0。而_exit不会执行这些操作。
    由于父子进程共享同一地址空间,当父进程恢复运行并调用printf时,不会产生任何输出,它返回-1。这就是上一节调用_exit的原因。
    然而,大多数exit的现代实现不再关闭流。因为进程即将终止,内核将关闭所有已打开的文件描述符。
    Linux程序的终止分为"正常终止"和"异常终止",具体可能情况如下:
    正常终止
    • 从main返回
    • 调用exit:ISO C定义
    • 调用_exit或_Exit:前者由ISO C定义,后者由POSIX.1定义
    • 最后一个线程从其启动例程返回
    • 最后一个线程调用pthread_exit
    异常终止
    • 调用abort:产生SIGABRT信号
    • 接到某些信号
    • 最后一个线程对取消请求做出响应
    几个要点:
    1.不管进程如何终止,最后都会执行内核中的同一段代码:为相应进程关闭所有打开描述符,释放内存等等。
    2.若父进程在子进程之前终止了,则子进程的父进程将变为init进程,其PID为1保证每个进程都有父进程。
    3.当子进程先终止,父进程如何知道子进程的终止状态?事实上,内核为每个终止子进程保存了终止状态等信息,父进程调用wait等函数,就可获取该信息。
    4.当父进程调用wait等函数后,内核将释放终止进程所使用的所有内存,关闭其打开的所有文件。
    5.对于已经终止、但是其父进程尚未对其调用wait等函数的进程,被称为僵尸进程(即已经结束,但尚未释放资源的)。
    6.对于父进程先终止,而被init领养的进程会是僵尸进程吗?init对每个终止的子进程,都会调用wait函数,获取其终止状态信息。
    综上所述,子进程调用exit后,父进程必须调用wait。
  • 相关阅读:
    数据库事务的四个隔离级别浅析
    Spring事务管理之几种方式实现事务
    SQL调优简介及调优方式
    Spring MVC工作流程图
    java中的垃圾回收机
    iOS 本地化-国际化-(App名字国际化)
    iOS-自建iPa应用分发平台
    稳定App缓存
    iOS-保存图片到(自定义)相册步骤
    iOS -根据网络状态加载图片
  • 原文地址:https://www.cnblogs.com/zhangyubao/p/7016912.html
Copyright © 2020-2023  润新知