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 :

Gestion de SIGTSTP


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 33
    Points : 34
    Points
    34
    Par défaut Gestion de SIGTSTP
    Voila j'ai un petit problème concernant la gestion d'une interruption provoquée par Control-Z!

    J'ai dans mon fichier un gestionnaire de signal qui intercepte correctement le signal SIGSTP (affichage du message) seulement cela ne me rend pas la main dans la console!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void stop(){
    printf("Supsension...\n");
    }
    int main(){
    ...
    sigStop.sa_handler=stop;
    sigemptyset(&sigStop.sa_mask);
    sigaction(SIGTSTP, &sigStop, NULL);
     
    }
    Quelqu'un a t il une idée, siouplé?

  2. #2
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    quand ton signale est déclenché ta fonction stop est applelée, mais après ton programe reprend le cours normal. si tu veux qu'il s'arrète il faut que dans ta fonction stop tu mettes un exit();
    De manière générale avec les signaux, si tu choisis d'en trapper un, système ne le traite plus du tout. C'est à toi de le faire. En gros soit tu t'en occupe sois il s'en occupe, mais c'est pas les deux. Il existe toutefois des astuces pour le faire, mais ce n'est pas propre.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 33
    Points : 34
    Points
    34
    Par défaut
    D'accord, merci! Donc quelles sont les fonctions de "suspension" de programme en C, pour que je puisse à la fin de la fonction stop(), suspendre l'éxecution et rendre la main dans la console?

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par backus
    Donc quelles sont les fonctions de "suspension" de programme en C, pour que je puisse à la fin de la fonction stop(), suspendre l'éxecution et rendre la main dans la console?
    Quels sont les mots que tu ne comprends pas dans :
    si tu veux qu'il s'arrète il faut que dans ta fonction stop tu mettes un exit();
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    heuu
    comme cité plus haut.

    le 0 c'est pour dire au système que tout c'est bien déroulé.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 33
    Points : 34
    Points
    34
    Par défaut
    Il y a une différence entre arrèter un programme et suspendre un programme! Certes, le nom de ma fonction prête à confusion!
    J'aimerai émuler l'action d'un Control-Z, cad le programme se freeze et rends la main!
    Désolé pour la mauvaise formulation!

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par backus
    Il y a une différence entre arrèter un programme et suspendre un programme! Certes
    Sur le plan pratique, c'est quoi la différence ?
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    autant pour moi exit() arrète l'exécution du programme, il ne la suspend pas . C'est moi qui n'était pas très attentif.
    Pour la suspension je ne connait pas de fonction qui font ça, désolé.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 33
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par backus
    Il y a une différence entre arrèter un programme et suspendre un programme! Certes
    Sur le plan pratique, c'est quoi la différence ?
    Bin... lance une application, fais un Control-C : là il est arrété ("Terminated"), relance-le, ça recommence du début.
    Maintenant, lance une application, fais Control-Z : là il est suspendu ("Suspended"), en faisant >fg je le relance là où il était!
    Dans la pratique c'est donc bien différent à mes yeux!

    Citation Envoyé par BigNic
    Pour la suspension je ne connait pas de fonction qui font ça, désolé.
    Merci quand même BigNic!

  10. #10
    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
    Ce que tu pourrais peut-être tenter (c'est pas du tout sûr que ça marche) c'est peut-être remettre le signal a SIG_DEFAULT (enfin c'est pas ce nom-là, mais un truc du genre) puis relancer le signal avec un kill()...

    Ou alors...
    Est-ce que les actions prédéfinies de signal() (SIG_IGNORE, SIG_DEFAULT, enfin des noms proches) sont appelables, ou bien ce n'est pas garanti dans la norme et ça peut être des constantes ?
    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.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 33
    Points : 34
    Points
    34
    Par défaut
    Pour relancer le signal avec kill(), j'ai déjà tenté mais évidemment il est de nouveau récupérer avec le gestionnaire et donc le programme bouvle dans ma fonction!
    Pour les actions prédéfinies de signal(), je vais voir...

  12. #12
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par backus
    Bin... lance une application, fais un Control-C : là il est arrété ("Terminated"), relance-le, ça recommence du début.
    Maintenant, lance une application, fais Control-Z : là il est suspendu ("Suspended"), en faisant >fg je le relance là où il était!
    Dans la pratique c'est donc bien différent à mes yeux!

    Merci quand même BigNic!
    J'avais bien compris oui. Je disais juste que je ne connais pas de fonction C qui suspend un programme.
    Sinon ce que dit medinoc, c'est la solution pas propre que j'évoquais dans mon premier post.
    Sur un suspend je n'ai jamais vue faire ça. Sur un signal de core (eq kill -6), j'ai déjà vue faire. On trappe le signal, on fait des affichages, on annul l'interception du signal et on le relace, et le systeme nous génère un beau core. En théorie ça marche, en pratique on perd des fois le contexte et le core rest analysable, mais il n'y aucune infos dedans.
    <pour une suspension une perte de contexte peut-être vraiment génate, mais bon tu peux essayer.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 33
    Points : 34
    Points
    34
    Par défaut
    Je répondais à Emmanuel, dsl pour l'oubli du quote!
    Sinon je vais chercher encore car je pense qu'une solution "propre" existe!

  14. #14
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    En remmettant le signal à SIG_DEFAULT comme le dit Médinoc, dans ton handler, avant de relancer le signal avec kill, ça devrait fonctionner.

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

Discussions similaires

  1. Gestion des signaux : SIGTSTP
    Par BSans dans le forum C
    Réponses: 1
    Dernier message: 22/12/2011, 16h17
  2. Réponses: 2
    Dernier message: 31/08/2002, 21h37
  3. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  4. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h53

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