2016-05-04 2 views
1

Je suis nouveau MinGW-w64 et je suis en cours d'exécution dans le problème suivant:Comportement étrange de la fonction abort C sur MinGW-w64

J'ai récemment installé MSYS sur mon ordinateur Windows 10 selon les instructions dans

How to install MinGW-w64 and MSYS2?

et je suis en train d'essayer de construire des programmes Win32 C. J'ai d'abord essayé quelques programmes simples et ils semblent fonctionner; Cependant, j'ai rencontré des problèmes avec la fonction C Abort.

Si je construis le programme suivant sur Linux

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

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

et courir plus tard, je reçois simplement la sortie

bla bla bla 
Aborted 

Cependant, sous Windows, la sortie est

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. 

Une fenêtre de message apparaît également avec le message

a.exe ne fonctionne plus - Un problème est survenu lors de l'arrêt du programme. Windows fermera le programme et vous informera si une solution est disponible.

Est-ce la façon dont il est censé être? Quoi qu'il en soit, je préfère de beaucoup la version Linux.

+1

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

+2

Oui, c'est comme ça que c'est censé être. Pourquoi ne devrait-il pas être ainsi? – immibis

Répondre

3

abort est la même que raise(SIGABRT).

Si vous ne surprenez pas le signal SIGABRT, le gestionnaire par défaut OS est invoquée, sous Linux est ce noyau de dumping, ce qui provoque la coquille d'écrire Aborted sur l'erreur standard.

Sous Windows, il se termine et le message que vous avez vu s'affiche, en cas d'erreur standard si le sous-système de la console est utilisé ou dans un message standard si gui. Cela peut être supprimé par le non-standard _set_abort_behavior.

Si vous voulez une action uniforme à travers les systèmes, vous devez enregistrer un gestionnaire SIGABRT et faire quelque chose vous-même:

#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

Notez que la raison pour laquelle cela supprime le 'message par défaut' est que le programme ne se ferme plus à la suite d'un signal - parce que vous utilisez 'exit()' ou '_exit()' ou quelque chose de similaire. Vous pouvez démontrer la différence avec un gestionnaire de signal comme ceci: 'void handle_abort (int sig) { fprintf (stderr," Abandonner le signal (% d) capturé par% s() \ n ", sig, __func__); Signal (sig, SIG_DFL); relance (sig); /* exit (128 + sig); */ } '(ou vous pouvez utiliser' exit() 'au lieu de' signal() 'plus' raise() '). Le 'message par défaut' vient en fait du shell. –

+0

@JonathanLeffler Vous avez raison, corrigé cette partie. – a3f