APP下载

第五十八章、linux中的3种正常结束程式的方式你都了解么

消息来源:baojiabao.com 作者: 发布时间:2024-05-20

报价宝综合消息第五十八章、linux中的3种正常结束程式的方式你都了解么

在前两章中我们了解了建立程序,这一章我们来了解下,在linux下怎么结束程序。

在linux中,有3种正常结束程序的方法和2种异常终止的方法:

1、 正常结束:

a、 在main函式中呼叫return。这个相当于呼叫exit。

b、 呼叫exit函式,按这个函式在ANSI C中的定义,呼叫时将执行所有注册过的exit控制代码,关闭所有的标准I/O流,但是并不处理档案描述符、多程序(父程序与子程序)、作业等,因而对linux系统而言并不完善。

c、 呼叫_exit函式。exit被_exit呼叫,关闭一些linux特有的退出控制代码。

2、异常终止

a、 呼叫abort。这个其实是第二种情形的特例,因为它产生一个SIGABRT讯号。

b、 程序收到特定讯号,这个讯号可以是程序自己产生的(如abort函式),也可以来自其他程序或核心。例如:程序企图访问越界的内存地址或者除数为零时,核心都会产生讯号中断程序。

不管用何种方式结束程序,最终都要执行核心的同一段程式码。这段程式码关闭该程序开启的所有档案描述符,私访占用的内存等。

接下来我们来了解下exit和_exit函式

这两个函式在不同的标头档案中:exit在stdlib.h中,_exit在unistd.h中

他们的具体呼叫形式如下:

void exit (int __status)

void _exit (int __status)

引数status为退出的状态。

我们来看一下下面这两段程式码:

图1

图2

图3

图4

图1的程式码缺少了 导致了没有打印出测试结束的语句,这是因为printf 如果不加 , 则资讯是不会立刻打印出来的,而 _exit 不会强制输出缓冲区中的资料,即通过printf/fprintf 这类呼叫产生的尚未写入装置仍在缓冲中的资料都会丢弃, _exit 时打印资讯会丢失,而 exit 不会。 如果有 ,则直接打印出来,此时 exit/_exit 无区别

父子程序终止的先后顺序不同会产生不同的结果

1.父程序先于子程序终止:

此种情况就是我们所说的孤儿程序。当父程序先退出时,系统会让init程序接管子程序 。

2.子程序先于父程序终止,而父程序又没有呼叫wait函式

此种情况子程序进入僵死状态,并且会一直保持下去直到系统重启。子程序处于僵死状态时,核心只储存程序的一些必要资讯以备父程序所需。此时子程序始终占有着资源,同时也减少了系统可以建立的最大程序数。

什么是 僵死状态呢?

一个已经终止、但是其父程序尚未对其进行善后处理(获取终止子程序的有关资讯,释放它仍占有的资源)的程序被称为僵死程序(zombie)。

3.子程序先于父程序终止,而父程序呼叫了wait函式

此时父程序会等待子程序结束。

2019-10-11 21:55:00

相关文章