我是mingw-w64的新手,我遇到了以下问题:
我最近在我的Windows 10计算机上安装了MSYS
中提供的说明How to install MinGW-w64 and MSYS2?
我正在尝试构建一些Win32 C程序。我先试了一下 简单的程序,它们似乎工作;但是,我遇到了问题 C中止功能。
如果我在Linux上构建以下程序
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
printf("bla bla bla\n");
abort();
}
然后运行它,我只是得到输出
bla bla bla
Aborted
但是,在Windows上,输出是
bla bla bla
This application has requested the Runtime to terminate it in an unusual
way. Please contact the application's support team for more information.
还会出现一个消息窗口,其中包含消息
a.exe已停止工作 - 一个问题导致程序停止正常工作。 Windows将关闭 程序并在有解决方案时通知您。
这是应该的样子吗?无论如何,我更喜欢Linux版本。
答案 0 :(得分:3)
abort
与raise(SIGABRT)
相同。
如果你没有捕获SIGABRT
信号,则调用默认的OS处理程序,在Linux上这是转储核心,导致shell在标准错误上写Aborted
。
在Windows上,它会终止并显示您看到的消息,如果使用控制台子系统,则显示标准错误;如果是gui,则显示在标准消息框中。这可以通过非标准_set_abort_behavior
来抑制。
如果您希望跨系统执行统一操作,则需要注册SIGABRT
处理程序并自行执行操作:
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>
void handle_abort(int sig)
{
// do something (e.g write to log)
// don't let this handler return if you want to suppress defaut handler
}
int main(void)
{
signal(SIGABRT, handle_abort);
abort();
}