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 :

Equivalent C au set_terminate de C++


Sujet :

C

  1. #1
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut Equivalent C au set_terminate de C++
    Bonjour à toutes et à tous,

    Je code un programme sur linux qui est sensé tourner constamment, mais j'aimerais quand même faire un peu le ménage si il est quitté par un CTRL-C ou kill.

    Du coup j'ai pensé à set_terminate, mais je vois qu'il n'existe pas en C.Y-a-t'il un moyen équivalent ?

    De plus, cette partie de code va-t-elle bien s'exécuter si on kill le logiciel ou si on CTRL-C ?

    Merci d'avance pour votre aide !!!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je ne crois pas qu'il y ait grand-chose en C standard, mais sous POSIX*, tu as la gestion de signaux. Elle peut faire du nettoyage en cas de Ctrl+C (SIGINT, SIGTERM et cie), mais pas en cas de kill: RIEN ne peut faire QUOI QUE CE SOIT en cas de kill.

    *Je sais qu'il y a un peu de gestion de signaux aussi en standard, mais je ne sais jamais quels signaux elle "connait". Je sais en tout cas que c'est beaucoup moins que POSIX.
    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
    Membre régulier Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Points : 75
    Points
    75
    Par défaut
    Je viens de voir qu'il y avait la librairie <signal.h> en C standard, et on peut gérer les différents signaux.

    Il y a une explication ici, par ex: http://www.xgc.com/manuals/xgclib/c1632.html
    "Les hommes et les femmes qui, sans bouger de leur bureau ou de leur bibliotheque, sans développer leur puissance corporelle et leurs infinies dimensions, parviennent, par une opération de la conscience, à une tristesse pessimiste qui se pretend lucide ne font que constater, sans le savoir, que toute identification du multiple de la vie à la vacuite de la conscience mène inévitablement à ce pessimisme et cette impuissance."

    extrait de "La fragilité" de Benasayag

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tiens, tous les signaux qui ici nous intéressent sont ANSI. Je n'aurais pas cru...
    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.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par PoZZyX Voir le message
    Bonjour à toutes et à tous,

    Je code un programme sur linux qui est sensé tourner constamment, mais j'aimerais quand même faire un peu le ménage si il est quitté par un CTRL-C ou kill.

    Du coup j'ai pensé à set_terminate, mais je vois qu'il n'existe pas en C.Y-a-t'il un moyen équivalent ?
    C'est normal car c'est une opération qui dépend du système sur lequel tu tournes et pas du langage à proprement parler (ce n'est pas la libC qui gère Ctrl-C). Il faut que tu fasse un gestionnaire de signal pour intercepter les signaux qui t'intéressent. Attention à choisir les bons. Voir pour cela man signal, man sigaction et man 7 signal.

    Tu peux regarder cette discussion également.

    Citation Envoyé par Médinoc Voir le message
    Tiens, tous les signaux qui ici nous intéressent sont ANSI. Je n'aurais pas cru...
    Ça m'a surpris aussi, la première fois…

  6. #6
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Merci pour toutes ces réponses. Je me pose une autre question maintenant. Un programme qui tourne constamment (toujours sur linux), comment le terminer sans le killer (lui dire de se terminer et que je puisse récupérer le message afin de faire un peu de nettoyage).

    Merci d'avance

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par PoZZyX Voir le message
    Merci pour toutes ces réponses. Je me pose une autre question maintenant. Un programme qui tourne constamment (toujours sur linux), comment le terminer sans le killer (lui dire de se terminer et que je puisse récupérer le message afin de faire un peu de nettoyage).

    Merci d'avance
    kill sert a envoyer un signal, si tu le traites tu fais ce que tu veux (pour autant que ce soit un signal interceptable).

    La tradition Unix pour les demons veut que
    - SIGTERM soit une demande de fin (c'est interceptable), c'est ce que tu veux (SIGTERM est d'ailleurs ce que le programme kill envoie par defaut, kill -9 c'est SIGKILL qui est envoye et SIGKILL n'est pas interceptable)
    - SIGHUP soit une demande de relire la configuration
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Merci pour toutes ces réponses, cela fonctionne effectivement à merveille avec signal.h et sigterm !!!

    Merci encore

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    - SIGHUP soit une demande de relire la configuration
    SIGHUP une demande de relecture de la config ? Je ne pense pas. Il n'y a pas de signal dédié à cela, mais c'est généralement à SIGUSR1 que l'on attribue cette tâche, de manière à ce que l'utilisateur puisse le faire.

    SIGHUP signifie « Hang Up » (« raccrocher ») et était envoyé quand une liaison téléphonique était coupée, volontairement ou non, et que l'on perdait le signal du modem. Comme on n'utilise pratiquement plus de liaison série distante pour exploiter des terminaux physiques, ce sont généralement les terminaux virtuels de X qui envoient ce signal quand ils sont refermés et qu'un processus y est toujours relié. C'est d'ailleurs pour cela que l'on a créé « nohup ». Dans tous les cas, par défaut, c'est la mort du processus.

    SIGHUP sur Wikipédia (en).

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    SIGHUP une demande de relecture de la config ?
    Citation Envoyé par Richard Stevens in Advanced Programming in the Unix Environment
    SIGHUP: [...] This signal is commonly used to notify daemon processes to reread their configuration.
    Et ca correspond a mes souvenirs de quand je faisais de l'admin.

    Je suis d'accord, c'est de la surchage par rapport a sa definition quand il y a un terminal controlant (et le [...] chez Stevens c'est pour expliquer le cas). Mais il n'y a pas de terminal controlant pour les terminaux, donc la surcharge n'a pas d'effet nuisible.

    Edit:
    Citation Envoyé par Wikipedia en
    Signals have always been a convenient method of inter-process communication (IPC), but in early implementations there were no user-definable signals (such as the later additions of SIGUSR1 and SIGUSR2) that programs could intercept and interpret for their own purposes. For this reason, applications that did not require a controlling terminal, such as daemons, would re-purpose SIGHUP as a signal to re-read configuration files, or reinitialize. This convention survives to this day in packages such as Apache and Sendmail.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Edit: …
    Info très pertinente que j'ajoute à mes bookmarks. Merci !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tiens, ça me rappelle qu'à mon école on avait une vieille version de HP-UX qui ne supportait pas SIGUSR1 et SIGUSR2...
    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.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/11/2002, 09h12
  2. equivalent à explode?
    Par djridou dans le forum Langage
    Réponses: 3
    Dernier message: 28/08/2002, 11h01
  3. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

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