2016-05-04 2 views
1

Ich bin neu in mingw-w64 und ich laufe in das folgende Problem:Seltsames Verhalten von C Abbruchfunktion auf mingw-w64

ich vor kurzem MSYS auf meinem Windows-Computer 10 gemäß den mitgelieferten Anweisungen installiert in

How to install MinGW-w64 and MSYS2?

und ich versuche zur Zeit einige Win32-C-Programme zu bauen. Ich probierte zuerst einige einfache Programme und sie scheinen zu arbeiten; Ich stieß jedoch auf Probleme mit der C-Abbruchfunktion.

Wenn ich das folgende Programm auf Linux

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

int main(int argc, char *argv[]) { 
    printf("bla bla bla\n"); 
    abort(); 
} 

bauen und es später laufen, habe ich einfach den Ausgang

bla bla bla 
Aborted 
jedoch

erhalten, unter Windows die Ausgabe

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. 

Außerdem erscheint ein Meldungsfenster mit der Meldung

a.exe funktioniert nicht mehr - Ein Problem hat dazu geführt, dass das Programm nicht mehr ordnungsgemäß funktioniert. Windows wird das Programm schließen und Sie benachrichtigen, wenn eine Lösung verfügbar ist.

Ist das so, wie es sein soll? Jedenfalls bevorzuge ich die Linux-Version.

+1

https://msdn.microsoft.com/en-us/library/k089yyh0.aspx – jdarthenay

+2

Ja, so soll es sein. Warum sollte es nicht so sein? – immibis

Antwort

3

abort ist das gleiche wie raise(SIGABRT).

Wenn Sie das Signal SIGABRT nicht abfangen, wird der Standard-OS-Handler aufgerufen, unter Linux ist dies ein Dumping-Core, wodurch die Shell Aborted auf Standardfehler schreibt.

Unter Windows wird es beendet und die Nachricht, die Sie gesehen haben, wird auf Standardfehler angezeigt, wenn das Konsolensubsystem verwendet wird, oder in einer Standardmeldungsbox, falls gui. Dies kann durch den nicht standardmäßigen _set_abort_behavior unterdrückt werden.

Wenn Sie eine einheitliche Aktion über Systeme wollen, benötigen Sie einen SIGABRT Handler registrieren und etwas selbst:

#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(); 
} 
+1

Beachten Sie, dass der Grund für das Unterdrücken der 'Standardnachricht' darin besteht, dass das Programm nicht mehr aufgrund eines Signals beendet wird - weil Sie 'exit()' oder '_exit()' oder etwas ähnliches verwenden. Sie können den Unterschied mit einem Signalhandler wie folgt demonstrieren: 'void handle_abort (int sig) { fprintf (stderr," Signal abbrechen (% d) abgefangen von% s() \ n ", sig, __func__); Signal (sig, SIG_DFL); erhöhen (sig); /* exit (128 + sig); */ } '(oder Sie können' exit() 'anstelle von' signal() 'plus' raise() ') verwenden. Die 'Standardnachricht' kommt tatsächlich von der Shell. –

+0

@ JonathanLeffler Du hast Recht, diesen Teil korrigiert. – a3f