-
直接转换abort函数从数据流图到模块结构图的方法
资源介绍
10.17 abort函数
前面已提及a b o r t函数的功能是使程序异常终止。
#include
void abort(void);
此函数不返回
此函数将S I G A B RT信号发送给调用进程。进程不应忽略此信号。
ANSI C要求若捕捉到此信号而且相应信号处理程序返回, a b o r t仍不会返回到其调用者。
如果捕捉到此信号,则信号处理程序不能返回的唯一方法是它调用 e x i t、_ e x i t、l o n g j m p或
s i g l o n g j m p。( 1 0 . 1 5节讨论了 l o n g j m p和s i g l o n g j m p之间的区别。)P O S I X . 1也说明a b o r t覆盖了进
程对此信号的阻塞和忽略。
让进程捕捉S I G A B RT的意图是:在进程终止之前由其执行所需的清除操作。如果进程并
不在信号处理程序中终止自己,P O S I X . 1说明当信号处理程序返回时,a b o r t终止该进程。
ANSI C对此函数的规格说明将这一问题留由实现决定,而不管输出流是否刷新以及不管
临时文件(见5 . 1 3节)是否删除。P O S I X . 1的要求则进了一步,它要求如果 a b o r t调用终止进程,
则它应该有对所有打开的标准 I / O流调用f c l o s e的效果。但是如果a b o r t调用并不终止进程,则它
对打开流也不应有影响。正如我们将在后面所看到的,这种要求很难实现。
系统V早期的版本中,a b o r t函数产生S I G I O T信号。更进一步,进程忽略此信
号,或者捕捉它并从信号处理程序返回都是可能的,在返回情况下, a b o r t返回到
它的调用者。
4 . 3 B S D产生S I G I L L信号。在此之前,该函数解除对此信号的阻塞,将其配置
恢复为SIG_DFL (终止并构造c o r e文件)。这阻止一个进程忽略或捕捉此信号。
S V R 4在产生此信号之前关闭所有 I / O流。在另一方面, 4 . 3 + B S D则不做此操
作。对于保护性的程序设计,如果希望刷新标准 I / O流,则在调用a b o r t之前要做这
种操作。在e r r _ d u m p函数中实现了这一点(见附录B)。
因为大多数UNIX tmpfile(临时文件)的实现在创建该文件之后立即调用u n l i n k,
所以ANSI C关于临时文件的警告通常与我们无关。
实例
程序1 0 - 1 8按P O S I X . 1的说明实现了a b o r t函数。对处理打开的标准 I / O流的要求是难于实现
的。首先查看是否执行了默认动作,并刷新了所有标准 I / O流。这并不等价于对所有打开的流
调用f c l o s e(因为只刷新,并不关闭它们),但是当进程终止时,系统会关闭所有打开文件。如
果进程捕捉此信号并返回,则刷新所有的流。(如果进程捕捉此信号,并且不返回,则不会触
及标准 I / O流。)没有处理的唯一条件是如果进程捕捉此信号,然后调用 _ e x i t。在这种情况下,
任何未刷新的存储器中的标准 I / O缓存都被丢弃。我们假定捕捉此信号,并特地调用 _ e x i t的调
用者并不想要刷新缓存。
回忆1 0 . 9节,如果调用 k i l l使其为调用者产生信号,并且如果该信号是不被阻塞的(程序
1 0 - 1 8保证做到了这一点),则在k i l l返回前该信号就被传送给了该进程。这样就可确知如果对
2 3 4 U N I X环境高级编程
- 上一篇: 强制调用函数-故障注入测试
- 下一篇: GDB环境变量-故障注入测试