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 :

Equivalent de kbhit ou getch sous unix sans ncurses


Sujet :

Linux

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut Equivalent de kbhit ou getch sous unix sans ncurses
    Rebonjour, me revoilà avec une question assez idiote...

    Je cherche un équivalent de getch de préférence sous Unix. j'ai trouvé ceci dans la faq, mais ça ne marche pas correctement... Enfin ça ne fait pas ce que je désire exactement (c-à-d un getchar() mais sans devoir appuyer sur ENTER).
    PS: le lien http://c.developpez.com/faq/c/?page=...e_clavier_unix

    Je ne peux utiliser ncurses.h ce qui complique assez les choses.

    Si vous pouvez m'aider, ce serait très apprécié.

  2. #2
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Coucou Dridri

    Et est-ce les restrictions que tu as t'autorisent à lier un fichier objet quelconque ? Je fais des recherches persos actuellement sur l'utilisation de la console sous Linux, et ta question m'interesse, puisque j'avais prévu de m'y pencher également.

    Je n'ai encore pas la solution, mais ça ne saurait tarder : quelques jours, ou deux semaines au plus... est-ce que ce ne serait pas trop long ?

    Sinon, tu peux utiliser l'assembleur ? Mais je pense qu'avoir un fichier objet à lier, serait plus simple pour toi. Avec quel langage programmes-tu ton application ? (c'est pour savoir quelle convention d'appel il faudra employer).

    Voili-voilouk ..

    A+

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tu as la reponse un peu plus bas dans la FAQ : ici.

  4. #4
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut
    Merci bien pour le mode raw Je n'avais pas vu, enfin si j'avais vu mais ne sachant pas ce que le titre voulait dire exactement je n'ai pas regarder plus attentivement.

    Je vais tester cela bientôt alors. Une petite question supplémentaire:
    Ctrl-C (interruption), Ctrl-D (EOF), Ctrl-Z (suspension) et les autres combinaisons de contrôle ne sont pas interprétées, mais le code ASCII correspondant est retourné.
    cela veut-il dire que mes signaux détournés ne seront pas correctement traités?

    Hibou75, en fait je n'ai pas beaucoup de restrictions mis à part qu'il faut le programmer en C et que cela doit tourner sur des machines SUN et hélas, il faut utiliser CC pour compiler. Pour l'assembleur, on fera sans, ce n'est pas très portable, surtout que les machines SUN n'utilisent pas le même processeur que mon petit et humble pc.

    le mode raw semble répondre à mes attentes, encore merci pour cette solution !

  5. #5
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Citation Envoyé par dridri
    Hibou75, en fait je n'ai pas beaucoup de restrictions mis à part qu'il faut le programmer en C et que cela doit tourner sur des machines SUN et hélas, il faut utiliser CC pour compiler. Pour l'assembleur, on fera sans, ce n'est pas très portable, surtout que les machines SUN n'utilisent pas le même processeur que mon petit et humble pc.
    Oui, c'est vrai, je m'en doutais un peu, mais je me suis trop vite précipité

    Merci DaZumba

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par dridri
    cela veut-il dire que mes signaux détournés ne seront pas correctement traités?
    Qu'appelles-tu signaux detournes ? En mode brut, comme son nom l'indique, rien n'est interprete. Il faut tout faire a la main.

  7. #7
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Dridri, peut-être que tu aurais une solution si tu regardais du coté des IOCTLs et termios (mais les IOCTLs ne sont pas POSIX, alors je ne sais pas si tu aura le droit sur ta machine SUN). Renseigne toi du coté de la programmation de la console en mode medium-raw (ça t'évitera de faire toute les réinterprétation qu'implique la méthode de DaZumba, au demeurant très honorable).

    En fait, il faudrait que tu lise la configuration de la console par un appel IOCTL avec le code de commande TCGETS pour sauvegarder l'état de la console dans une structure termios. C'est pour restaurer l'état quand le programme se termine, et c'est important qu'un programme restaure l'état dans lequel il a trouvé son environnement. Tu utilise par exemple une variable termios_backup, tu type termios.

    Ensuite, tu copie termios_backup dans une variable my_termios (par exemple), et là, tu dois effacer le flag ICANON du champ c_iflag (en faisant par exemple my_termios.c_iflag = my_termios.c_iflag & ~ICANON).

    Ensuite tu appel IOCTLs avec le code de commande TCSETSW, et avec ta variable my_termios.

    L'opération importante est d'éffacer le flag ICANON, car c'est lui qui fait que tu doit appuyer sur entrée chaque fois que tu veux lire un caractère.

    Je ne veux pas rallonger encore ce post et t'ennuyer, mais je te dis juste que ICANON correspond au mode canonique de la console. Si tu veux plus d'explication, n'hésite pas à me demander.

    Quand ton programme se termine, n'oubli pas de lui faire restaurer l'état de la console, avec IOCTLs et le code de commande TCSETSW et ta variable termios_backup.

    Je ne sais pas s'il existe une méthode POSIX (POSIX est une norme que doivent respecter l'implémentation de certain programe, et j'ignore si c'est le cas du tien) de faire le même chose, mais je crois que ces IOCTLs là existe bien aussi pour SUN (elle sont très répandu dans les faits, même si elle ne sont pas POSIX).

    Dis moi si les explications ne te paraissent pas assez clair, et alors je prendrai le temps de faire pour toi un petit programme d'exemple en C (et de le tester )

    Voili-voilou Dridri....

  8. #8
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Citation Envoyé par Hibou57
    Dridri, peut-être que tu aurais une solution si tu regardais du coté des IOCTLs et termios
    [...]

    Voili-voilou Dridri....
    mais c'est EXACTEMENT ce que fait le code de la FAQ (http://c.developpez.com/faq/c/?page=...CREEN_mode_raw )

    et je confirme, les IOCTL//Termios sont dispo sous SUN.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 13
    Par défaut kbhit sous SUN
    Moi, sous Solaris, je fais :

    #include <stropts.h>
    // ...

    int n = 0 ;
    if ( ioctl( fileno( stdin ), I_NREAD, & n ) >= 0 && n > 0 )
    {
    // n caratères sont dispos
    }

    En espérant que ça aide....
    (sous fedora, a priori ca marche pas).

Discussions similaires

  1. Call un .so sous Unix sans connaitre le nom de la fonction
    Par yopiyop4485 dans le forum Bibliothèque standard
    Réponses: 7
    Dernier message: 16/09/2009, 13h59
  2. Equivalent de ces bibliothèques sous unix
    Par _SamSoft_ dans le forum C
    Réponses: 26
    Dernier message: 05/09/2007, 14h42
  3. equivalent de ORADIM sous unix
    Par Laye dans le forum Oracle
    Réponses: 3
    Dernier message: 01/12/2006, 08h35
  4. [Kylix] Kylix sous UNIX
    Par gRRosminet dans le forum EDI
    Réponses: 3
    Dernier message: 09/11/2004, 17h07
  5. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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