Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre à l'essai
    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 : 23
    Points
    23

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 458
    Points : 13 935
    Points
    13 935

    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 à l'essai
    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 : 23
    Points
    23

    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 :
    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 à l'essai
    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 : 23
    Points
    23

    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
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 458
    Points : 13 935
    Points
    13 935

    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 à l'essai
    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 : 23
    Points
    23

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •