2013-06-23 2 views
2

J'ai un serveur de console qui écoute les clients et fait ce dont ils ont besoin. Mais parfois j'ai besoin de serveur final et je ne sais pas comment je peux le faire correctement. Parce que je peux frapper ctrl + c pour terminer le programme, mais j'ai un code important après la boucle que je dois faire. Est-ce que je peux attraper un signal de la console et exécuter la fonction pour faire des choses importantes et terminer correctement?pause de la boucle infinie de la console

end_program(){ 
    do_something_important(); 
    return 0; 
} 

Ou quelle est la meilleure façon de faire ce que je peux faire dans ma situation?

+0

duplication possible de [Que se passe-t-il lorsque vous fermez une application de console C++] (http://stackoverflow.com/questions/696117/what-happens-when-you-close-ac-console-application) – GSerg

+0

duplication possible de [Comment gérer un signal ctrl-break dans une interface de ligne de commande] (http://stackoverflow.com/q/181413/11683) – GSerg

Répondre

3

Vous pouvez utiliser des signaux:

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

static void on_close(int signal) 
{ 
    puts("Cleaning up..."); 
    exit(EXIT_SUCCESS); 
} 

int main(void) 
{ 
    signal(SIGINT, on_close); 

    while (1) 
    { 
    } 

    return EXIT_SUCCESS; 
} 
4

Utiliser des signaux comme Pragmateek décrit, mais assurez-vous de ne mettre un drapeau dans votre gestionnaire de signal (comme exitnow = true), et vérifier ce drapeau dans votre boucle principale . Les signaux peuvent interrompre votre programme principal à n'importe quel point de votre code, donc si vous voulez être sûr que votre logique ne sera pas interrompue au hasard ou coupée, utilisez des gestionnaires de signaux juste pour définir des indicateurs.

+1

+1 pour la meilleure pratique Vous pouvez même ajouter un compteur si la boucle principale est bloquée. que si l'utilisateur demande à terminer par 3 fois vous quittez directement. – Pragmateek