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 :

Gérer l'interruption involontaire d'un programme C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Par défaut Gérer l'interruption involontaire d'un programme C
    Bonjour,

    Je réalise des simulations numériques en mécanique à l'aide d'un code maison codé en C. En fonction du problème à traiter, les calculs peuvent êtres plus ou moins lents (de quelques minutes à quelques semaines de calcul, bref), je souhaite intégrer dans mon code, un petit programme qui permettrait de stoker dans un fichier les informations nécessaires pour reprendre le calcul en cas d'interruption inattendue.

    J'ai évidemment une idée précise sur les informations que j'ai besoin de stoker pour lancer une suite de calcul ou plutôt une reprise de calcul à l'endroit où il s'est arrêté.

    Dans le cas où le calcul arrive jusqu'au bout (sortie prévue), il est simple d'écrire un fichier suite de calcul mais dans le cas d'une interruption involontaire je ne sais pas comment faire...

    Connaissez-vous une méthode capable de répondre à mon besoin?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Ce qui serait envisageable, ce serait par exemple d'écrire dans un fichier les informations nécessaires à des intervalles réguliers (toutes les X minutes (ou heures) ).
    Par conséquent, si le programme venait à se fermer pour quelque raison que ce soit, il lui suffirait alors de lire le contenu du fichier à la recherche des informations dernièrement enregistrées, puis de reprendre son exécution normale.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Par défaut
    En fait ça le programme il le fait déjà pour certaines données que j'exploite mais ce n'est pas suffisant car si le calcul venait de s'interrompre pour une raison x ou y, je peux quand même perdre quelques itérations. Par exemple, supposant que j'ai 2.000.000 d'itérations à faire et que je décide de faire une sauvegarde toutes les 20.000 itérations, si l'interruption se produit à 19.999 itérations, aucune sauvegarde n'aura été effectuée et j'aurai perdu 19.000 itérations.

    Je vais essayer de retrouver le code source d'une autre personne que j'avais trouvé sur internet il y a longtemps, si ma mémoire est bonne, cette personne utilisait un fichier d'entête signal.h et avait définit une structure en utilisant #ifndefine. Par contre, je ne sais pas si c'était du C ou du C++.

    Je regarde ça et je posterai le bout de code source.

    Merci jeroman

  4. #4
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    le fichier signal fait partie de POSIX qui definit effectivmenet divers signaux, utilisé pour les systemes d'exploitation type UNIX, ou gerer des alarmes.
    le signal que vous cherchez est surement SIGINT pour les interruptions.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    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 474
    Par défaut
    Tout d'abord, sous quel système travailles-tu (Windows ? Linux ? Autre (à préciser) ? …).

    Pour compléter ce que dit Jéroman, il faut que tu fasses une fonction distincte servant à enregistrer, lorsque qu'elle est appelée, l'état actuel de ton environnement. Tu appelles ensuite cette même fonction chaque fois que c'est nécessaire : sur demande explicite, à intervalles réguliers, lorsque le calcul aboutit et lorsque l'application est interrompue prématurément.

    Sous Unix, lorsque c'est le système qui met fin à l'application (Ctrl-C de l'utilisateur, commande kill, ou autre raison…), celle-ci reçoit un signal Unix, généralement SIGTERM ou SIGINT, selon les cas, qui est pris en charge par un handler par défaut, qui soit ignore le signal, soit provoque sa mort. Tu peux installer ton propre handler pour faire tes sauvegardes avant de sortir.

    Fais une recherche sur ce forum, car ce thème a été longuement débattu. Gérer un signal est relativement simple mais cela demande quand même un peu d'attention et, surtout, d'être sûr d'avoir bien compris comment ils fonctionnent.

    man 2 signal ;
    man 7 signal ;
    man sigaction.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 122
    Par défaut
    Merci pour vos réponses.

    Citation Envoyé par Obsidian Voir le message
    Tout d'abord, sous quel système travailles-tu (Windows ? Linux ? Autre (à préciser) ? …).
    Je suis sous Windows avec MinGW.

    Citation Envoyé par Obsidian Voir le message
    Pour compléter ce que dit Jéroman, il faut que tu fasses une fonction distincte servant à enregistrer, lorsque qu'elle est appelée, l'état actuel de ton environnement. Tu appelles ensuite cette même fonction chaque fois que c'est nécessaire : sur demande explicite, à intervalles réguliers, lorsque le calcul aboutit
    Ce travail est réalisé par une fonction qui existe déjà dans mon code.

    Citation Envoyé par Obsidian Voir le message
    et lorsque l'application est interrompue prématurément.
    C'est ça que j'ai du mal à gérer d'où l'intérêt de mon message.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/10/2011, 11h46
  2. Gérer l'auto-complétion dans un programme C
    Par fatelmout dans le forum Débuter
    Réponses: 7
    Dernier message: 05/04/2011, 21h23
  3. Réponses: 4
    Dernier message: 07/07/2010, 13h36
  4. Réponses: 4
    Dernier message: 19/10/2007, 10h44
  5. Comment gérer les interruptions des programmes ?
    Par Olivier Regnier dans le forum Langage
    Réponses: 6
    Dernier message: 10/04/2007, 01h27

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