abort函数-鸿鹄论坛_华为认证h35-211-hcnp-access network题库
10.17 abort函数前面已提及abort函数的功能是使程序异常终止。
#include <stdlib.h>
void abort(void);
stdlib.h>
此函数不返回此函数将SIGABRT信号发送给调用进程。进程不应忽略此信号。ANSI C要求若捕捉到此信号而且相应信号处理程序返回,abort仍不会返回到其调用者。如果捕捉到此信号,则信号处理程序不能返回的唯一方法是它调用exit、_exit、longjmp或siglongjmp。POSIX.1也说明abort覆盖了进程对此信号的阻塞和忽略。让进程捕捉SIGABRT的意图是:在进程终止之前由其执行所需的清除操作。如果进程并不在信号处理程序中终止自己,POSIX.1说明当信号处理程序返回时,abort终止该进程。
ANSI C对此函数的规格说明将这一问题留由实现决定,而不管输出流是否刷新以及不管临时文件是否删除。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函数中实现了这一点。因为大多数UNIX tmpfile(临时文件)的实现在创建该文件之后立即调用unlink,所以ANSI C关于临时文件的警告通常与我们无关。
实例程序10-18按POSIX.1的说明实现了abort函数。对处理打开的标准I/O流的要求是难于实现的。首先查看是否执行了默认动作,并刷新了所有标准I/O流。这并不等价于对所有打开的流调用fclose(因为只刷新,并不关闭它们),但是当进程终止时,系统会关闭所有打开文件。如果进程捕捉此信号并返回,则刷新所有的流。(如果进程捕捉此信号,并且不返回,则不会触及标准I/O流。)没有处理的唯一条件是如果进程捕捉此信号,然后调用_exit。在这种情况下,任何未刷新的存储器中的标准I/O缓存都被丢弃。我们假定捕捉此信号,并特地调用_exit的调用者并不想要刷新缓存。
回忆10.9节,如果调用kill使其为调用者产生信号,并且如果该信号是不被阻塞的(程序10-18保证做到了这一点),则在kill返回前该信号就被传送给了该进程。这样就可确知如果对234UNIX环境高级编程下载。
相关资源: