先看下"_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。

Linux学习之“exit函数”的更多相关文章

  1. Linux学习之“vfork函数”

    为什么使用vfork()? 希望父子进程执行不同的代码.例如: 网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达. ...

  2. Linux学习之“fork函数”

    n返回值: fork函数调用一次,但是返回两次:在子进程中返回0,在父进程中返回子进程ID,出错返回-1.通过返回值,可以确定是在父进程还是子进程中. n子进程和父进程继续执行fork调用之后的指令. ...

  3. Linux学习笔记 - Shell 函数的使用

    基本语法 funname () { action; return -)):如果不加,将以最后一条命令运行结果,作为返回值. } 示例1:定义并调用无返回值的函数 #!/bin/bash a= b= c ...

  4. Linux C _exit函数与exit函数的联系与区别

    一.联系 1.功能上,_exit和exit函数都是让进程正常退出,即关闭进程所打开的文件描述符,释放已占用内存和其他资源. 二.区别 1._exit函数在头文件unistd.h中声明,而exit在头文 ...

  5. Linux内核的ioctl函数学习

    Linux内核的ioctl函数学习 来源:Linux公社  作者:Linux 我这里说的ioctl函数是在驱动程序里的,因为我不知道还有没有别的场合用到了ioctl, 所以就规定了我们讨论的范围.为什 ...

  6. Linux多任务编程之四:exit()函数及其基础实验(转)

    来源:CSDN  作者:王文松   转自Linux公社 exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit() ...

  7. Linux学习笔记16——wait函数

    wait函数的定义如下: #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_loc); wai ...

  8. 【Linux编程】进程终止和exit函数

    内核要运行一个应用程序,唯一的途径是通过系统调用.exec函数.exec又会调用启动程序,启动程序(一般是汇编语言)以类似以下的方式调用main函数: void exit(main(argc, arg ...

  9. Linux学习笔记14——使用fcntl实现文件锁定

    期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...

随机推荐

  1. html中如何实现表格移入移出时背景颜色改变?(两种方法)

    html中如何实现表格移入移出时背景颜色改变?(两种方法) 一.总结 1.通过css的table标签的hover属性: 10 #tab:hover{ 11 background: green 12 } ...

  2. PatentTips - Hardware virtualization such as separation kernel hypervisors

    BACKGROUND 1. Field Innovations herein pertain to computer virtualization, computer security and/or ...

  3. [Angular] Working with FormArray

    'FormArray' can work with array of 'FormGroup' or 'FormControl'. form = new FormGroup({ stock: new F ...

  4. Android studio 无法启动安卓模拟器

    1.通过Android SDK Manager在extra中,找到并选中了那个Intel x86 Emulator Accelerator (HAXM) 2.手动启动HAXM    去对应的sdk\e ...

  5. sql知识收藏小总结

    div { background-color: #eee; border-radius: 3px; border: 1px solid #999; padding: 4px; display: blo ...

  6. 让ProgressDialog在setCancelable(false)时按返回键可dismiss

    最近发现Android4.0系统中ProgressDialog设置为setCancelable(true)时,点击ProgressDialog以外的区域也可以让ProgressDialog dismi ...

  7. wpf mvvm datagrid数据过滤

    原文:wpf mvvm datagrid数据过滤 datagrid数据过滤,你可以通过设置RowStyle属性,通过将Visibility绑定到ViewModel层的属性来控制是否可见,比如:   & ...

  8. poi读取xlsx

    知道 大家都知道用poi读取xls  当时有时候 必需要读取xlsx  如今我把我做測试的demo分享给大家 package com.lt.main; import java.io.File; imp ...

  9. 概率论经典问题 —— 三个事件 A、B、C 独立 ≠ 三个事件两两独立

    三个事件 A.B.C 相互独立?三个事件两两独立? A:第一次正面朝上: B:第二次正面朝上: C:第一次和第二次结果不同: P(AB)=P(A)P(B): P(AC)=1/4=P(A)P(C)(不是 ...

  10. Python 内置函数 —— format

    科学计数法: >> format(2**20, '.2e') '1.05e+06' 小数 ⇒ 百分数 >> format(.1234, '.1%') 12.3%