1.进程的终止 : _exit() 和 exit()1. _exit(int status), status 定义了终止状态,父进程可调用 wait 获取。仅低8位可用,调用 _exit() 总是成功的。2.程序一般不会调用 _exit(), 而是调用库函数 exit()。exit() 执行如下动作:1.调用退出处理程序(通过 atexit() 和 on_exit() 注册的函数),其执行顺序与注册顺序相反。2.刷新 stdio 流缓冲区3.使用由 status 提供的值执行 _exit() 系统调用。与专属的Unix的 _exit 不同, exit() 则属于标准C语言函数库。2.进程终止的细节无论进程是否正常终止,都会发生如下动作:1.关闭所有打开文件描述符,目录流,信息目录描述符,以及转换描述符2.作为文件描述符关闭的后果之一,将释放该进程所持有的任何文件锁3.分离任何已经连接的 System V 共享内存段,且对应于各段的 shm_nattch 计数器值减一4.进程为每个 System V 信号量所设置的 semadj 值将会被加到信号量值中。5.如果该进程是一个管理终端的管理进程,那么系统会向该终端前台进程组中的每个进程发送 sighup 信号,接着终端会于会话脱离。6.将关闭该进程打开的任何 POSIX 有名信号量,类似调用 sem_close()7.将关闭该进程打开的任何 POSIX 消息队列,类似于调用 mq_close()8.作为进程退出的后果之一,如果某进程组称为孤儿,且该组中存在任何已停止进程,则组中所有进程都将收到 sighup 信号,随着为 sigcont 信号。9.移除该进程通过 mlock() 和 mlockall() 锁建立的任何内存锁10.取消该进程调用 mmap() 所创建的任何内存映射。3.退出处理程序退出处理程序是一个由程序设计者提供的函数,可于进程生命周期的任意时间点注册,并在该进程调用 exit() 正常终止时自动执行。如果程序直接调用 _exit() 或者因信号而异常终止,则不会调用退出处理程序。当程序收到信号而终止时,将不会调用退出处理程序。这一事实一定程序上限制了它们的效用。此时最佳的应对方式莫若为可能发送给进程的信号建立信号处理程序,并于其中设置标志位,领主程序据此来调用 exit()。因为 exit() 不属于异步信号安全函数,所有通常不能在信号处理程序中对其发起调用。atexit();on_exit(); 通过 fork 创建的子进程会继承退出处理程序,而 exec 会清除退出处理程序。4.fork,stdio缓冲区以及_exit 之间的交互#include <stdio.h>int main()
{printf("start:\n");if ( fork() == -1 ) {exit(1);}exit(0);
}printf() 信息输出了2次,是在进程的用户空间内存维护 stiod 缓冲区的。因此,通过 fork 创建的子进程会复制这些缓冲区。父子进程调用 exit() 时,会各自刷新 stdio 缓冲区,从而导致重复输出。可以采用以下2种方法避免:1.可以在调用 fork 之前,使用 fflush() 来刷新 stdio 缓冲区,作为另外一种选择,使用 setvbuf() 和 setbuf() 来关闭 stdio 流缓冲。2.子进程可以调用 _exit() 而非 exit(),以便不刷新 stdio 缓冲区。这一技术例证了更为通用的原则:在创建子进程的应用中,典型情况下仅一个进程(一般为父进程)应通过调用 exit() 终止,而其他进程应调用 _exit()终止,从而确保一个进程调用退出处理程序刷新 stdio 缓冲区。write 并未出现2次,是因为 write 会将数据直接传递给内核缓冲区,fork 不会复制这一缓冲区。

25.Linux/Unix 系统编程手册(上) -- 进程的终止相关推荐

  1. linux/unix系统编程手册11-15

    title: linux/unix编程手册-11_15 date: 2018-05-27 11:53:07 categories: programming tags: tips linux/unix编 ...

  2. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  3. Linux/Unix系统编程 五:进程

    进程是一个可执行程序的实例. 一.linux系统进程管理 1.进程管理的作用 判断机器健康状态 查看系统中所有进程 杀手进程 2.查看系统进程 1.ps -aux BSD操作系统格式: TTY说明: ...

  4. Linux/UNIX系统编程手册gg

    Linux系统: "所见皆文件" 一个比较好的博客 一.Linux基础操作 Linux系统目录: bin:存放二进制可执行文件 boot:存放开机启动程序 dev:存放设备文件: ...

  5. UNIX系统编程小结(三)----进程相关

    进程即一个程序的动态执行.引用apue上的一句话:"A thorough understanding of the UNIX System's process control is esse ...

  6. 【Linux系统编程】特殊进程之守护进程

    00. 目录 文章目录 00. 目录 01. 守护进程概述 02. 守护进程查看方法 03. 编写守护进程的步骤 04. 守护进程代码 05. 附录 01. 守护进程概述 守护进程(Daemon Pr ...

  7. 【Linux系统编程】特殊进程之僵尸进程

    00. 目录 文章目录 00. 目录 01. 僵尸进程概述 02. 僵尸进程案例 03. 避免僵尸进程 04. 附录 01. 僵尸进程概述 进程已运行结束,但进程的占用的资源未被回收,这样的进程称为僵 ...

  8. Linux系统编程 74 孤儿进程和僵尸进程

    Linux系统编程  74 孤儿进程和僵尸进程 学习笔记 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为 init进程,称为init进程领养了孤儿进程. init进程会去接替 ...

  9. Linux系统编程手册-源码的使用

    Linux系统编程手册-源码的使用 转自:http://www.cnblogs.com/pluse/p/6296992.html 第三章后续部分重点介绍了后面章节所要使用的头文件及其实现,主要如下: ...

  10. 【Linux系统编程】特殊进程之孤儿进程

    00. 目录 文章目录 00. 目录 01. 孤儿进程概述 02. 孤儿进程代码 03. 附录 01. 孤儿进程概述 父进程运行结束,但子进程还在运行的子进程就称为孤儿进程(Orphan Proces ...

最新文章

  1. a byte of python-A Byte of Python PDF 下载
  2. 一本通1655数三角形
  3. 原始Junit测试Spring的问题
  4. 每日一题:leetcode74.搜索二维矩阵
  5. 流行编程语言_编程语言的流行度排名
  6. 开源短地址_如何在短短5分钟内完成您的第一个开源贡献
  7. OSError: [Errno 22] Invalid argument:**
  8. 重磅盘点!2018年更受欢迎的技术干货,来来回回也就看了几十遍吧
  9. linux打开python3_linux 进入python
  10. Hibernate ,Mybatis 区别,以及各自的一级,二级缓存理解
  11. 在编写mini2440 helloworld驱动遇到的问题
  12. 一文了解SG2525AN
  13. 【接口测试】Jmeter+ant安装及简单使用教程(集成)
  14. ❤️❤️新生代农民工熬夜整理Python入门教程,包教包会!附源码❤️❤️
  15. 1-9 requests模块之爬取4k高清壁纸(xpath解析)
  16. Win10桌面图标排列混乱
  17. 怎样查找某个外文期刊的文献?
  18. AE脚本:AE导入SubRip/SRT/TXT/VTT字幕
  19. linux 查看es进程,Linux---关闭Elasticsearch进程,并重新启动
  20. uni-app 手势放大图片

热门文章

  1. 【洛谷P1800】software_NOI导刊2010提高(06)
  2. SDWebImage之SDImageCache
  3. TreeMap按照key排序
  4. Linux编译安装PHP Mysql Nginx
  5. R语言信用评分卡:探索性数据分析
  6. Lesson 05 for Plotting in R for Biologists
  7. java替代重定向_一个简单的java重定向程序,为什么要恢复System . out 对象,却不要恢复System...
  8. IDEA中java文件的左下角有个像乐符一样的J符号
  9. 用turtle实现动态汉诺塔
  10. 在VC++ 6.0下利用共享内存、消息实现内部进程通讯