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

Bibliothèques, systèmes et outils C Discussion :

[UNIX] Modifier un caractère de contrôle


Sujet :

Bibliothèques, systèmes et outils C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut [UNIX] Modifier un caractère de contrôle
    Bonjour,

    J'ai justement un projet d'examen à faire en C, sous Unix (Solaris 10).
    Et je me retrouve un peu coincé...

    Je voudrais envoyer le signal SIGINT à un processus.
    Ca peut très facilement se faire via le raccourci clavier ctrl-c.

    Cependant, je suis contraint de remplacer le ctrl-c par un ctrl-a, et c'est là que ça coince...
    On m'a dit de chercher du côté de termios.h, mais je ne trouve pas grand chose...

    Auriez-vous une idée ?

    Merci beaucoup !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour,

    Depuis la ligne de commande, tu peux déjà utiliser la commande stty pour modifier les paramètres du terminal. Fais stty -a pour voir les attributs en vigueur (en tout cas, c'est vrai sous Linux. Aussi loin que je me souvienne, c'est la même chose sous Solaris). C'est le paramètre intr qui te permettra d'accéder à ce qui t'intéresse présentement.

    Si tu dois le faire en C, il faut d'abord utiliser tcgetattr() pour récupérer les paramètres en vigueur, les modifier à ta guise, puis appeler tcsetattr() pour les mettre à jour. Les caractères spéciaux utilisés pour les interruptions se trouvent dans un tableau de char nommé c_cc. Il y a plusieurs symboles qui servent d'index à ce tableau pour aller chercher le bon caractère. Celui qui t'intéresse est VINTR.

    Tous les détails sont derrière ce lien : man termios.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut
    Merci, ces informations devraient bien m'aider

    Par contre, quel est le descripteur de fichier que je dois fournir à tcgetattr() et tcsetattr() ?
    D'après ce que j'ai compris, c'est un descripteur associé au terminal. Comment puis-je le récupérer ?

    Edit : Ok, j'ai trouvé pour le descripteur, enfin je crois...
    J'ai fait comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int tty = STDOUT_FILENO;
    C'est correct ?

    Et pour accéder au caractère ctrl-c, comment dois-je faire ?
    J'ai essayé
    (ou termAttr est la structure termios qui contient les infos) mais ça me donne un caractère bizarre... Rien avoir avec '^c' en tout cas...

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut
    Ok, c'est bon, j'ai trouvé, ça fonctionne nickel.

    C'est bien termAttr.c_cc[VINTR] pour accéder au caratère ctrl-c, c'est juste l'affichage qui n'était pas ce à quoi je m'attendais.

    Et visiblement, le int tty = STDOUT_FILENO est correct aussi, car tout fonctionne, c'est bien pour le terminal en question que le caractère est changé.

    Donc à priori, tout est ok

    Merci beaucoup !

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    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 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Quelques précisions toutefois :

    Par nature, « c_cc » ne contient qu'un seul caractère par type d'action, et pas une séquence. En outre, « ^C » est une notation utilisée à ma connaissance quasi-exclusivement sur PC et qui signfie « Ctrl-C ». La touche Ctrl, que l'on retrouve sur la plupart des machines, parfois même très anciennes, n'est pas une méta-key ordinaire : elle sert à envoyer les codes de contrôles de la table ASCII (de 0 à 31).

    « Ctrl-C » envoie donc systématiquement le code 03. En principe, ça correspond au marqueur « EOT : End Of Text » mais depuis l'aube de l'informatique (à partir de 1969 sur TOPS 20, selon Wikipédia), cette séquence a été synonyme de break : ça a été repris par Unix, puis par CP/M, puis DOS, puis par les systèmes Microsoft de l'époque, dont MS/DOS mais également les BASIC qu'elle a édité, ainsi que tous ceux des huit bits concurrents de l'époque. « Ctrl-C » est donc une séquence traditionnellement associée à l'interruption du déroulement d'un programme, beaucoup plus encore que le « Copier » du Copier-Coller bureautique, même aujourd'hui.

    Ça veut dire que c'est exactement le code numérique 03 qui est associé à « intr » sous Unix par défaut, et ce code est par définition un caractère non affichable, d'où les bizarreries que tu as pu voir.

    Ensuite, utiliser « STDOUT_FILENO » (autrement le fd #1) est une méthode traditionnellement utilisée, relativement fiable et la plus facile à utiliser dans ta situation. Cependant, elle n'est pas totalement orthodoxe.

    En effet, les processus en cours d'exécution peuvent être regroupés en sessions et en groupe de processus, lesquels peuvent être officiellement rattachés à une console. Ils peuvent toutefois s'en détacher (par exemple lorsqu'un programme devient un dæmon pour fonctionner en arrière-plan), ils peuvent n'en avoir jamais eu, ou être liés à un tube qui ne débouche pas sur une console (cas du pipe entre plusieurs commandes).

    Puisque la sortie standard est renvoyée par défaut vers l'écran, on en conclut que son descripteur doit être celui de la console, mais ce n'est pas une certitude, et ça ne nous dit pas laquelle. Il n'est alors pas évident de retrouver la console exacte auquel on est officiellement rattaché. Toutefois, le périphérique spécial « /dev/tty » renvoie toujours vers elle. C'est un moyen à peu près fiable d'y accéder sans forcément savoir de laquelle il s'agit.

    La commande « tty » dans le Shell te donnera explicitement son nom.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut
    Merci pour ces précisions, pour le moins intéressantes

    J'aurai l'occasion de tester le projet sur le serveur SUN d'ici quelques jours (la présentation finale se faisant sur ce dernier). Ça me permettra de vérifier que tout fonctionne bien, le remplacement du ctrl-c n'étant qu'une petite partie du projet...

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

Discussions similaires

  1. [Character SET] Modifier un caractére
    Par ducho dans le forum Oracle
    Réponses: 5
    Dernier message: 24/03/2014, 16h50
  2. Comment modifier un caractère dans MySQL
    Par Strategis dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 17/06/2007, 06h54
  3. Réponses: 1
    Dernier message: 29/10/2006, 11h03
  4. [C#] Modifier Propriété d'un contrôle d'une autre Form
    Par sara21 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/09/2006, 20h41
  5. [VB.NET] Modifier un caractère d'un string
    Par mat087 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/11/2005, 23h44

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