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

 C Discussion :

Fin d'un script


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut Fin d'un script
    Bonjour à tous ceux qui liront ce message.
    Alors j'ai créé un programme qui crée une socket sur un port donné et reste en écoute dans l'attente d'un message. Je l'ai ensuite démonisé pour qu'il survive après fermeture de la console.
    Ca c'était pur la mise en bouche. Je cherche une fonction ou une méthode qui me permette d'écrire un log si le programme se ferme anormalement. C'est à dire une fermeture extérieur (ctrl+c), passage d'une cleaner etc...

    Un truc du genre

    main
    {

    }
    si fermeture du programme
    {
    je fais ca(en l'occurance j'écris des logs)
    }

    Si je n'ai pas été claire n'hésitez pas à me posé des question mais pas du genre "pourquoi as tu créé ce programme?" hein
    Merci d'avance du temps que vous pourrez me consacrer.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu parles d'une fin vraiment anormale comme une segfault, c'est mort: atexit() / onexit() ne marche pas contre ça.

    Je ne vois pas trop ce que tu peux faire à part envelopper l'appel du programme dans un autre programme qui surveille sa valeur de retour...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut
    Je parle bien d'une fin anormale. Mais pas d'une fin type segmentation fault mais plus d'une fin provoquée par un élément extérieux comme un simple kill ou un ctrl+c.

    Je vais essayé de creuser du coté du programme englobant mon démon.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    Salut.

    Il faut intercepter le signal qui t'intéresse et effectuer le traitement en conséquence. Le seul signal que tu ne peux intercepter est le signal 9 (SIGKILL) si je ne m'abuse.

    Pour ce faire :

    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
    27
    28
    29
     
    #include <signal.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    FILE *log;
     
    void 
    traitement (int sig)
    {
        fprintf (log, "Signal %d capturé\n",sig);
        fclose (log);
        exit (sig);
    }
     
    int
    main (int argc, char **argv)
    {
        log = fopen ("/chemin/du/log","w+");
        if (log == NULL)
        {
            fprintf (stderr, "Impossible d'ouvrir le fichier de log");
            return 1;
        }
        signal (SIGINT, traitement); /* SIGINT correspond au ctrl+c */
        /* implémentation de notre programme */
        fclose (log);
        return 0;
    }

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sauf qu'on ne peut pas tout faire dans une fonction de traitement de signal...
    http://www.opengroup.org/onlinepubs/...ns/signal.html
    f the signal occurs other than as the result of calling abort(), raise(), [CX] [Option Start] kill(), pthread_kill(), or sigqueue(), [Option End] the behavior is undefined if the signal handler refers to any object with static storage duration other than by assigning a value to an object declared as volatile sig_atomic_t, or if the signal handler calls any function in the standard library other than one of the functions listed in Signal Concepts .
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Par défaut
    En effet, en fonction du signal on a plus ou moins de "libertés" quant au traitement de la sortie.
    Mais sur un SIGINT, je pense qu'il est tout à fait possible d'écrire un log.

    Il me semble cependant que certains signaux ferment tous les descripteurs de fichiers encore ouverts.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 473
    Par défaut
    Citation Envoyé par bl_netim Voir le message
    Je parle bien d'une fin anormale. Mais pas d'une fin type segmentation fault mais plus d'une fin provoquée par un élément extérieux comme un simple kill ou un ctrl+c.
    Ça dépend du système que tu utilises. Sous les unixoïdes, toutefois, les kills et Ctrl-C envoient un signal à ton processus, et ce signal peut être associé à un handler de ton cru. Généralement, les fins de programme provoquées se traduisent par la réception de SIGTERM, SIGINT ou SIGHUP.

    Vois du côté de signal() ou sigaction().

    Attention toutefois à écrire un gestionnaire qui soit sûr, histoire de ne pas provoquer de segfault ou autre au sein de ce gestionnaire. Dans le cas contraire, tu pourras toujours t'en sortir mais ça risque de compliquer les choses.

Discussions similaires

  1. [MySQL] header() à la fin d'un script
    Par hichamdeb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/03/2010, 15h42
  2. Message box à la fin d'un script
    Par Devilstuff dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/09/2009, 14h31
  3. Attendre la fin d'un script externe avant de continuer le script python
    Par Mistervanhalen dans le forum Général Python
    Réponses: 1
    Dernier message: 18/03/2009, 16h05
  4. [AJAX] Attendre la fin d'un script php
    Par Bludwarf dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 18/06/2008, 00h12
  5. Réponses: 0
    Dernier message: 27/08/2007, 13h16

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