IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

Interruption d'un programme par SIGINT


Sujet :

Administration système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Par défaut Interruption d'un programme par SIGINT
    Bonjour,

    Je souhaite executer un processus tournant en continu (boucle quasi infinie) jusqu'à ce que le signal SIGINT soit recu par mon processus. Cependant, Lorsque SIGINT est capturé par mon process, je souhaite uniquement modifier une variable permettant de quitter ma boucle infinie et revenir à ma fonction main. Pour l'instant, tous mes essais ont été infructueux, je ne retourne pas dans ma fonction main.

    J'illustre ma description ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    int IsRunning;
     
    void SortiePrecipitee (int signal){
     
    	if (signal == SIGINT){
    		IsRunning = 0;
    	}
    }
     
     
    int main()
    {
                 /* configuration de la fonction en cas de ctrl -C */
    	(void *)signal(SIGINT, SortiePrecipitee);
     
    	IsRunning = 1;
     
    	while(IsRunning == 1){
                     fonction1();				
    	}
     
    	fonction2();
    	return 0;
    }
    Lorsque je tape CTRL-C dans ma console, je veux pouvoir revenir dans mon main et quitter normalement ma fonction. Pour l'instant fonction2 n'est jamais executée, je ne sais même pas ou part le programme une fois que FermeturePrecipitee est terminée. Tout ce que je sais c'est que je n'ai pas la main sur mon shell et que je suis obligé de tuer mon appli par la fonction KILL.

    Je sais que j'aurai la possibilité d'éxécuter fonction2 dans mon handler FermeturePrecipitee, mais je ne souhaite pas le faire ainsi.

    L'objectif final est de transformer le signal d'interruption par un nouveau signal que j'aurai défini moi même, lequel sera généré par un autre process.

    Quelqu'un aurait une idée sur le déroulement des différents appels et comment faire pour modifier ma variable IsRunning dans mon handler puis revenir à mion main ?

    Merci de votre aide

    Nicolae

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Est-ce que tu es sûr que fonction1() se termine ? autrement dit, est-ce que tu es sûr que tu parcours plus d'une fois ta boucle while ?

    Tu devrais tester la valeur de retour de signal() pour détecter les cas d'erreur.

    Ton programme n'est pas multi-threadé par hasard ?

  3. #3
    Membre du Club
    Inscrit en
    Août 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 6
    Par défaut
    Merci pour ton intervention, mais je viens de voir ce qu'il se passait !!!

    En fait, dans mon programme, je lisais le port série. Dans mon handler je fermais le port Série. et fonction2 avit pour mission de lire les dernières données qui étaient arrivées sur le port avant que je le ferme. Sauf que je l'avais déjà fermé du coup ma fonction read ne retournait jamais. et la commande Ctrl-C ne me permettait pas de reprendre la main sur le shell ...

    C'etait une erreur d'algo. Je classe le post en resolu !

    Nicolas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DELPHI 2005] Désinstaller un programme par programmation
    Par danbern dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 02/06/2005, 18h05
  2. [Eiffel] Programmation par contrats
    Par SkIllz2k dans le forum Autres langages
    Réponses: 1
    Dernier message: 02/05/2005, 21h05
  3. programmation par composant
    Par pmboutteau dans le forum ASP
    Réponses: 4
    Dernier message: 10/03/2005, 12h35
  4. [Tests]La programmation par contrats
    Par fabien.raynaud dans le forum Test
    Réponses: 6
    Dernier message: 26/07/2004, 12h06
  5. Programmation par module : applications multilingues
    Par argoet dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 03/02/2004, 12h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo