1. 首页
  2. 考试认证
  3. 其它
  4. HDS AMS 2500用户手册

HDS AMS 2500用户手册

上传者: 2024-07-22 16:35:20上传 PDF文件 17.98MB 热度 5次

10.17 abort函数

前面已提及,abort函数的功能是使程序异常终止。具体地,#include 中定义了 void abort(void); 函数。该函数不返回,它会将 SIGABRT 信号发送给调用进程,而进程不应忽略此信号。ANSI C标准要求,如果捕捉到此信号且信号处理程序返回,abort仍不会返回到其调用者。那么,究竟会发生什么呢?

当进程捕捉到 SIGABRT 信号时,信号处理程序唯一的选择是调用 exit_exitlongjmpsiglongjmp(在10.15节讨论了 longjmpsiglongjmp 之间的区别)。POSIX.1 还规定,abort函数会覆盖进程对此信号的阻塞和忽略。如果进程终止之前需要执行清除操作,捕捉 SIGABRT 信号是有意为之。

ANSI C 的规格说明中提到,如果捕捉到此信号,信号处理程序返回后,abort仍会终止进程。而POSIX.1进一步规定,abort函数调用应有 fclose 效果,即关闭所有打开的标准I/O流。但如果abort函数没有终止进程,则不会影响打开的流。这种规定在系统实现中确实存在难度。

不同系统对此信号的处理方式也有所不同。比如,早期的System V版本中,abort函数会产生 SIGIOT 信号,而进程可以忽略此信号或从信号处理程序返回。在4.3BSD中,abort函数会产生 SIGILL 信号,这会解除对此信号的阻塞并恢复默认配置,即终止进程并构造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流非常重要。

如果对上述内容感兴趣,可以查阅《ISO POSIX Linux Unix标准C函数速查手册》中的更多细节:链接。或者,想进一步了解相关的ANSI C函数库,可以访问这个资源:ANSI C函数库

对处理打开的标准I/O流的要求是难于实现的。比如,如果进程捕捉此信号并返回,则需刷新所有的流;而如果捕捉此信号但不返回,则不会触及标准I/O流。唯一未处理的情况是,进程捕捉此信号后调用 _exit,在这种情况下,未刷新的标准I/O缓存将被丢弃。回忆10.9节中的内容,如果调用 kill 使其为调用者产生信号,并且该信号是不被阻塞的(程序10-18保证了这一点),那么在 kill 返回前,该信号就已被传送给了进程。

有关更详细的说明和例子,可以参考《ISO POSIX Linux Unix标准C函数c++速查手册》:链接

你可以更加全面地了解abort函数及其相关的处理机制。

下载地址
用户评论