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

Linux Discussion :

[Linux] signaux et mode console


Sujet :

Linux

  1. #1
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut [Linux] signaux et mode console
    Salutations !!

    J'essaye de faire en sorte que les programmes qui fonctionnent essentiellement en mode console, pour des raisons pédagogiques et didactiques, au travers d'une librairie de fonctions (une boîte à outils) pour mes élèves,
    n'affichent pas les caractères ^C et ^Z lorsque ceux-ci sont pressés...

    Sur l'image http://paste.opensuse.org/92490341

    ...je suis parvenu à "détourner" le message SIGINT sans afficher ces bêtes caractères ^C, par contre concernant ^Z j'ai tout de même une "crasse" lorsque j'appuie sur la combinaison de touches :{

    Voici la fonction qui devrait permettre de ne pas afficher les caractères assimilés à ce type de signaux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int toggleSignalsEcho(void)
    {
    	struct termios		terminal;
     
    	if(tcgetattr(STDOUT_FILENO, &terminal)==-1) return -1;
     
    	terminal.c_lflag ^= (ECHOCTL|~ISIG);                                     // éviter de voir ^C ou ^Z quand on appuye sur ces touches...
     
    	tcsetattr(STDOUT_FILENO,TCSAFLUSH,&terminal);
    	return 0;
    }
    Le programme de test contient ces instructions concernant le "détournement" des signaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    detournement.sa_handler=ArretPropre;
    sigaction(SIGHUP,&detournement,NULL);				// kill -1
    sigaction(SIGQUIT,&detournement,NULL);				// kill -3
    sigaction(SIGTERM,&detournement,NULL);				// kill -15
    sigaction(SIGSEGV,&detournement,NULL);				// kill -11 
     
    protection.sa_handler=SIG_IGN;
    sigaction(SIGINT,&protection,NULL);					// ignorer le CTRL-C
    sigaction(SIGPIPE,&protection,NULL);					// kill -13 (là je suis pas certain de ce que je fais :{ )
     
    // 25 jan 2018
    sigaction(SIGTSTP,&protection,NULL);					// ignorer le CTRL-Z (mais il affiche une merde à l'écran quand même :{)
    Je ne sais pas bien comment faire -- j'ai bien une manière de "masquer" le caractère appuyé, via une séquence ANSI qui efface le dernier caractère affiché en déplaçant le curseur vers la gauche, affichant un espace, puis de nouveau déplacer le curseur sur la gauche --
    mais si dans la librairie standard C il existe un "flag" qui peut masquer un echo de séquence de contrôle (https://ftp.gnu.org/old-gnu/Manuals/.../libc_355.html) je me demande bien comment je n'arrive pas à masquer le '^Z' de manière propre ^^

  2. #2
    Membre averti

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 313
    Points : 354
    Points
    354
    Par défaut
    Solution:
    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
     
    int toggleSignalsEcho(void)
    {
    	struct termios		terminal;
     
    	if(tcgetattr(STDOUT_FILENO, &terminal)==-1) return -1;
     
    	// juillet 2018
    	terminal.c_lflag |= ~ISIG;	
            terminal.c_cc[VSUSP]=0;
    	terminal.c_lflag ^= ECHOCTL;																		// éviter de voir ^C ou ^Z quand on appuye sur ces touches...
     
     
    	tcsetattr(STDOUT_FILENO,TCSAFLUSH,&terminal);
    	return 0;
    }
    ...rien à faire, il faut LIRE le man... et suivre les liens sur les sites :{

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

Discussions similaires

  1. Réponses: 22
    Dernier message: 14/09/2013, 21h35
  2. Capture Swing par mail en mode console (Linux)
    Par Stef784ever dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 04/06/2012, 17h32
  3. Linux en mode console uniquement .ISO
    Par HRS dans le forum Distributions
    Réponses: 9
    Dernier message: 03/05/2010, 11h39
  4. gestion de touches en mode console sous linux
    Par rudyhadoux dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 03/10/2008, 09h15
  5. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23

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