10.17 abort函数前面已提及abort函数的功能是使程序异常终止。#include
ANSI C对此函数的规格说明将这一问题留由实现决定,而不管输出流是否刷新以及不管临时文件(见5.13节)是否删除。POSIX.1的要求则进了一步,它要求如果abort调用终止进程,则它应该有对所有打开的标准I/O流调用fclose的效果。但是如果abort调用并不终止进程,则它对打开流也不应有影响。正如我们将在后面所看到的,这种要求很难实现。系统V早期的版本中,abort函数产生SIGIOT信号。更进一步,进程忽略此信号,或者捕捉它并从信号处理程序返回都是可能的,在返回情况下,abort返回到它的调用者。4.3BSD产生SIGILL信号。在此之前,该函数解除对此信号的阻塞,将其配置恢复为SIG_DFL (终止并构造core文件)。这阻止一个进程忽略或捕捉此信号。SVR4在产生此信号之前关闭所有I/O流。在另一方面,4.3+BSD则不做此操作。
对于保护性的程序设计,如果希望刷新标准I/O流,则在调用abort之前要做这种操作。在err_dump函数中实现了这一点(见附录B)。因为大多数UNIX tmpfile(临时文件)的实现在创建该文件之后立即调用unlink,所以ANSI C关于临时文件的警告通常与我们无关。
实例程序10-18按POSIX.1的说明实现了abort函数。对处理打开的标准I/O流的要求是难于实现的。首先查看是否执行了默认动作,并刷新了所有标准I/O流。这并不等价于对所有打开的流调用fclose(因为只刷新,并不关闭它们),但是当进程终止时,系统会关闭所有打开文件。如果进程捕捉此信号并返回,则刷新所有的流。(如果进程捕捉此信号,并且不返回,则不会触及标准I/O流。)
ISO POSIX Linux Unix标准C函数c++速查手册
没有处理的唯一条件是如果进程捕捉此信号,然后调用_exit。在这种情况下,任何未刷新的存储器中的标准I/O缓存都被丢弃。我们假定捕捉此信号,并特地调用_exit的调用者并不想要刷新缓存。回忆10.9节,如果调用kill使其为调用者产生信号,并且如果该信号是不被阻塞的(程序10-18保证做到了这一点),则在kill返回前该信号就被传送给了该进程。这样就可确知如果对234 UNIX环境高级编程下载。
暂无评论