abort 函数之前有讲过的,参看:C语言再学习 -- 关键字return和exit ()函数
然后我们在讲 8 中进程终止时,也说过。参看:UNIX再学习 -- exit 和 wait 系列函数
下面来详细讲一下它。
一、函数 abort
- #include <stdlib.h>
- void abort(void);
- 此函数无返回值
1、函数功能
abort 函数的功能是使程序异常终止
2、函数解析
abort 函数首先解除进程对 SIGABRT 信号的阻止,然后向调用进程发送该信号。abort 函数会导致进程的异常终止除非 SIGABRT 信号被捕捉并且信号处理句柄没有返回。
如果 abort 函数导致进程终止,则所有打开的流都将关闭并刷新。
如果SIGABRT信号被忽略,或被返回的处理程序捕获,则abort()函数仍将终止进程。 它通过恢复 SIGABRT 的默认配置,然后再次发送信号来做到这一点。
3、abort 函数实现
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-
- void
- abort(void) /* POSIX-style abort() function */
- {
- sigset_t mask;
- struct sigaction action;
-
- /* Caller can't ignore SIGABRT, if so reset to default */
- sigaction(SIGABRT, NULL, &action);
- if (action.sa_handler == SIG_IGN) {
- action.sa_handler = SIG_DFL;
- sigaction(SIGABRT, &action, NULL);
- }
- if (action.sa_handler == SIG_DFL)
- fflush(NULL); /* flush all open stdio streams */
-
- /* Caller can't block SIGABRT; make sure it's unblocked */
- sigfillset(&mask);
- sigdelset(&mask, SIGABRT); /* mask has only SIGABRT turned off */
- sigprocmask(SIG_SETMASK, &mask, NULL);
- kill(getpid(), SIGABRT); /* send the signal */
-
- /* If we're here, process caught SIGABRT and returned */
- fflush(NULL); /* flush all open stdio streams */
- action.sa_handler = SIG_DFL;
- sigaction(SIGABRT, &action, NULL); /* reset to default */
- sigprocmask(SIG_SETMASK, &mask, NULL); /* just in case ... */
- kill(getpid(), SIGABRT); /* and one more time */
- exit(1); /* this should never be executed ... */
- }
4、函数实现解析
首先看是否将执行默认动作,若是则冲洗所有标准 I/O 流。这并不等价于对所有打开的流调用 fclose (因为只冲洗,并不关闭它们),但是当进程终止时,系统会关闭所有打开的文件。如果进程捕捉此信号并返回,那么因为进程可能产生了更多的输出,所以再一次冲洗所有的流。不进行冲洗处理的唯一条件是如果进程捕捉此信号,然后调用 _exit 或 _Exit。这种情况下,任何未冲洗的内存中的标准 I/O 缓存都被丢弃。我们假定捕捉此信号,而且 _exit 或 _Exit 的调用者并不想要冲洗缓冲区。
5、示例说明
- //示例一
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <signal.h>
-
- void fa (int signo)
- {
- printf ("捕捉到了信号%d\n", signo);
- }
- int main (void)
- {
- signal (SIGABRT, fa);
- printf ("1111111111111\n");
- abort ();
- printf ("2222222222222\n");
- return 0;
- }
- 输出结果:
- 1111111111111
- 捕捉到了信号6
- 已放弃 (核心已转储)
- //示例二
- #include <stdio.h>
- #include <stdlib.h>
-
-
- int main ()
- {
- FILE *fp;
-
- printf("准备打开 nofile.txt\n");
- fp = fopen( "nofile.txt","r" );
- if(fp == NULL)
- {
- printf("准备终止程序\n");
- abort();
- }
- printf("准备关闭 nofile.txt\n");
- fclose(fp);
-
- return(0);
- }
- 输出结果:
- 如果没有 nofile.txt 文件则:
- 准备打开 nofile.txt
- 准备终止程序
- 已放弃 (核心已转储)
6、示例解析
调用 abort 函数,发送 SIGABRT 信号;abort 将所有打开的流都将关闭并刷新。
abort 函数之前有讲过的,参看:C语言再学习 -- 关键字return和exit ()函数
然后我们在讲 8 中进程终止时,也说过。参看:UNIX再学习 -- exit 和 wait 系列函数
下面来详细讲一下它。
一、函数 abort
- #include <stdlib.h>
- void abort(void);
- 此函数无返回值
1、函数功能
abort 函数的功能是使程序异常终止
2、函数解析
abort 函数首先解除进程对 SIGABRT 信号的阻止,然后向调用进程发送该信号。abort 函数会导致进程的异常终止除非 SIGABRT 信号被捕捉并且信号处理句柄没有返回。
如果 abort 函数导致进程终止,则所有打开的流都将关闭并刷新。
如果SIGABRT信号被忽略,或被返回的处理程序捕获,则abort()函数仍将终止进程。 它通过恢复 SIGABRT 的默认配置,然后再次发送信号来做到这一点。
3、abort 函数实现
- #include <signal.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
-
- void
- abort(void) /* POSIX-style abort() function */
- {
- sigset_t mask;
- struct sigaction action;
-
- /* Caller can't ignore SIGABRT, if so reset to default */
- sigaction(SIGABRT, NULL, &action);
- if (action.sa_handler == SIG_IGN) {
- action.sa_handler = SIG_DFL;
- sigaction(SIGABRT, &action, NULL);
- }
- if (action.sa_handler == SIG_DFL)
- fflush(NULL); /* flush all open stdio streams */
-
- /* Caller can't block SIGABRT; make sure it's unblocked */
- sigfillset(&mask);
- sigdelset(&mask, SIGABRT); /* mask has only SIGABRT turned off */
- sigprocmask(SIG_SETMASK, &mask, NULL);
- kill(getpid(), SIGABRT); /* send the signal */
-
- /* If we're here, process caught SIGABRT and returned */
- fflush(NULL); /* flush all open stdio streams */
- action.sa_handler = SIG_DFL;
- sigaction(SIGABRT, &action, NULL); /* reset to default */
- sigprocmask(SIG_SETMASK, &mask, NULL); /* just in case ... */
- kill(getpid(), SIGABRT); /* and one more time */
- exit(1); /* this should never be executed ... */
- }
4、函数实现解析
首先看是否将执行默认动作,若是则冲洗所有标准 I/O 流。这并不等价于对所有打开的流调用 fclose (因为只冲洗,并不关闭它们),但是当进程终止时,系统会关闭所有打开的文件。如果进程捕捉此信号并返回,那么因为进程可能产生了更多的输出,所以再一次冲洗所有的流。不进行冲洗处理的唯一条件是如果进程捕捉此信号,然后调用 _exit 或 _Exit。这种情况下,任何未冲洗的内存中的标准 I/O 缓存都被丢弃。我们假定捕捉此信号,而且 _exit 或 _Exit 的调用者并不想要冲洗缓冲区。
5、示例说明
- //示例一
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <signal.h>
-
- void fa (int signo)
- {
- printf ("捕捉到了信号%d\n", signo);
- }
- int main (void)
- {
- signal (SIGABRT, fa);
- printf ("1111111111111\n");
- abort ();
- printf ("2222222222222\n");
- return 0;
- }
- 输出结果:
- 1111111111111
- 捕捉到了信号6
- 已放弃 (核心已转储)
- //示例二
- #include <stdio.h>
- #include <stdlib.h>
-
-
- int main ()
- {
- FILE *fp;
-
- printf("准备打开 nofile.txt\n");
- fp = fopen( "nofile.txt","r" );
- if(fp == NULL)
- {
- printf("准备终止程序\n");
- abort();
- }
- printf("准备关闭 nofile.txt\n");
- fclose(fp);
-
- return(0);
- }
- 输出结果:
- 如果没有 nofile.txt 文件则:
- 准备打开 nofile.txt
- 准备终止程序
- 已放弃 (核心已转储)
6、示例解析
调用 abort 函数,发送 SIGABRT 信号;abort 将所有打开的流都将关闭并刷新。
来源:CSDN
作者:kz01081
链接:https://blog.csdn.net/kz01081/article/details/103605253