通过


abort

中止当前进程,并返回错误代码。

注意

请勿使用此方法关闭 Microsoft Store 应用或通用 Windows 平台 (UWP) 应用,除非在测试或调试方案中。 根据 Microsoft Store 策略,禁止以编程或 UI 方式关闭 Store 应用。 有关详细信息,请参阅 UWP 应用生命周期

语法

void abort( void );

返回值

abort 不会将控制权返回给进行调用的进程。 默认情况下,它检查中止信号处理程序,如果设置了 SIGABRT,则对其进行提升。 然后,abort 终止当前进程,并向父进程返回退出代码。

备注

Microsoft 专用

默认情况下,当使用调试运行时库构建应用程序时,abort 例程在 SIGABRT 得到提升之前显示错误消息。 对于在控制台模式下运行的控制台应用程序,该消息发送到 STDERR。 以窗口模式运行的 Windows 桌面应用程序和控制台应用程序在消息框中显示此消息。 要取消该消息,请使用 _set_abort_behavior 来清除 _WRITE_ABORT_MSG 标志。 所显示的消息取决于使用的运行时环境的版本。 对于使用最新版本的 Visual C++ 构建的应用程序,该消息类似于:

R6010 - abort () 已调用

在以前版本的 C 运行时库中,该消息显示为:

此应用程序已请求运行时以异常方式终止它。 有关详细信息,请联系应用程序的支持团队。

当程序在调试模式下编译时,消息框显示“中止”、“重试”或“忽略”选项。 如果用户选择“中止”,该程序立即终止并返回退出代码 3。 如果用户选择“重试”,将调用调试器进行实时调试(如果可用)。 如果用户选择“忽略”,abort 将继续正常处理。

在零售和调试版本中,abort 接着检查是否设置了中止信号处理程序。 如果设置了非默认信号处理程序,abort 将调用 raise(SIGABRT)。 使用 signal 函数将中止信号处理程序函数与 SIGABRT 信号相关联。 你可以执行自定义操作,例如清除资源或日志信息,并在处理程序函数中使用自己的错误代码终止应用程序。 如果未定义任何自定义信号处理程序,则 abort 不会引发 SIGABRT 信号。

默认情况下,在桌面或控制台应用的非调试版本中,abort 调用 Windows 错误报告服务机制(以前称为 Dr. Watson)向 Microsoft 报告故障。 调用 _set_abort_behavior 并设置或过滤 _CALL_REPORTFAULT 标志可启用或禁用此行为。 设置标志后,Windows 将显示一个消息框,其中包含类似于“问题导致程序停止正常工作”之类的文本。用户可以选择使用“调试”按钮调用调试器,或者选择“关闭程序”按钮以终止应用,其中包含操作系统定义的错误代码。

如果未调用 Windows 错误报告处理程序,则 abort 将调用 _exit 以使用退出代码 3 终止该进程,并将控制权返回给父进程或操作系统。 _exit 不刷新流缓冲区或执行 atexit/_onexit 处理。

出于 Windows 兼容性原因,当 abort 调用 _exit 时,它可能会调用 Windows ExitProcess API,而该 API 又会允许 DLL 终止例程运行。 析构函数不在可执行文件中运行,但对于加载到可执行文件进程空间中的 DLL,可能并非如此。 这种行为并不严格符合 C++ 标准。 若要立即终止包含任何 DLL 的进程,请使用 Windows TerminateProcess API。 还可以注册一个中止信号处理程序,该 TerminateProcess 处理程序调用符合标准的行为。 符合性行为在 Windows 兼容性方面可能付出了一定代价。

有关 CRT 调试的详细信息,请参阅 CRT 调试技术

结束Microsoft特定

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此状态,请参阅 CRT 中的全局状态

要求

例程 必需的标头
abort <process.h><stdlib.h>

示例

下面的程序尝试打开一个文件,如果该尝试失败,则中止。

// crt_abort.c
// compile with: /TC
// This program demonstrates the use of
// the abort function by attempting to open a file
// and aborts if the attempt fails.

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    FILE    *stream = NULL;
    errno_t err = 0;

    err = fopen_s(&stream, "NOSUCHF.ILE", "r" );
    if ((err != 0) || (stream == NULL))
    {
        perror( "File could not be opened" );
        abort();
    }
    else
    {
        fclose( stream );
    }
}
File could not be opened: No such file or directory

另请参阅

使用 abort
abort 函数
进程和环境控制
_exec_wexec 函数
.- .
raise
signal
_spawn_wspawn 函数
_DEBUG
_set_abort_behavior