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 运行时库中,该消息显示为:

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.

当程序在调试模式下编译时,消息框显示“中止”、“重试”或“忽略”选项。 如果用户选择“中止”,该程序立即终止并返回退出代码 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 调试技术

End Microsoft Specific

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此状态,请参阅 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