C ++: Continuer l’exécution après SIGINT

Ok, j’écris un programme qui fait des parsings assez lourdes et je voudrais pouvoir l’arrêter rapidement.

J’ai ajouté un signal(SIGINT, terminate); au début du principal et du défini se terminent comme:

 void terminate(int param){ cout << endl << endl << "Exit [N]ow, or [A]fter this url?" <> answer; if(answer[0] == 'n' || answer[0] == 'N'){ terminateParser(); exit(1); }else if(answer[0] == 'a' || answer[0] == 'A'){ quitAfterUrl = true; } } 

Sous Linux, cela a fonctionné comme je l’espérais, c’est-à-dire qu’il attendait une entrée utilisateur. Mais quand j’essaie de faire la même chose dans Windows, il affiche le message et quitte quand même.

Est-il possible d’empêcher SIGINT de fermer le programme immédiatement?

Mettre à jour:

quand j’ai essayé

 BOOL WINAPI handler(DWORD dwCtrlType) { if (CTRL_C_EVENT == dwCtrlType) { // ask the user } return FALSE; } 

Comme Gregory l’a suggéré, le programme s’est encore arrêté sans cérémonie sans s’arrêter pour la saisie de l’utilisateur.

Mise à jour 2: Je ne suis pas tout à fait sûr de ce qu’il a fait, mais le code fonctionne maintenant. Merci à tous pour votre aide.

De MSDN:

Remarque SIGINT n’est pris en charge par aucune application Win32, y compris Windows 98 / Me et Windows NT / 2000 / XP. Lorsqu’une interruption CTRL + C se produit, les systèmes d’exploitation Win32 génèrent un nouveau thread pour gérer spécifiquement cette interruption. Cela peut entraîner le multithread d’une application à thread unique, telle qu’UNIX, ce qui entraîne un comportement inattendu.

Ce qui signifie que vous devrez utiliser la directive de prétraitement et implémenter une solution spécifique à Windows .

 BOOL WINAPI handler(DWORD dwCtrlType) { if (CTRL_C_EVENT == dwCtrlType) { // ask the user } return FALSE; } 

Et au début du main vous faites

 SetConsoleCtrlHandler(handler, TRUE);