Périphérique clavier sous Unix
Comment capturer toutes les entrées de l'utilisateur, la lecture d'un octet à la fois?
J'ai fait ce codage, mais cela ne fonctionne pas
if ((fd = open("/dev/char", O_RDONLY) != 1) {
tty = open("/dev/tty", O_RDONLY);
tcsetattr(0, TCSANOW, &orig_info);
read (fd, &buf, sizeof(char));
}
close(fd);
Je m'attendais à la borne d'attente pour l'entrée, mais il n'a pas.
Non, juste de lire à partir fd 0
OriginalL'auteur Bunny Bunny | 2013-04-07
Vous devez vous connecter pour publier un commentaire.
Le clavier de l'appareil lui-même est l'une des entrées dans
/dev/input
. Vous pouvez localiser les claviers et autres périphériques d'entrée par type de connexion (par exemple, PS/2, USB, ...) dans/dev/input/by-path
. Évidemment, vous aurez besoin d'exécuter en tant que root pour accéder directement au matériel, et vous aurez besoin de fournir votre propre traduction à partir de matières octets en provenance du clavier dans des choses comme les touches et les principaux communiqués de presse. Ce n'est probablement pas ce que vous voulez.Si vous exécutez une application graphique, le faible niveau de la méthode est d'appeler
XNextEvent
et d'autres fonctions dans la même famille. Le décodage des événements d'entrée n'est pas complètement triviale, c'est à des applications d'appliquer des modificateurs. Un GUI cadre (le Motif, Gtk, Qt, ...) pourrait vous aider.Si vous utilisez une application de terminal, lire l'entrée standard ou de
/dev/tty
(/dev/tty
est toujours le terminal de votre programme est en cours d'exécution, même si l'entrée standard a été redirigée). Vous aurez envie de mettre le terminal en le mode raw. Vous obtiendrez décodé touches du clavier, et les touches de fonction la plupart du temps comme des séquences d'échappement. Ici aussi, une bibliothèque d'aide; le standard de facto est ncurses.OriginalL'auteur Gilles
Exactement ce que vous voulez faire?
Si ce que vous cherchez est sans tampon d'entrée dans le terminal,
tcsetattr()
est ce que vous cherchez - vous besoin de mettre le terminal dans le non-canonique, c'est à dire définir le terminal drapeaux de ne pas contenir deICANON
- voir, par exemple,cet extrait de code. Voirman termios
(ou le nom de la fonction, il habituellement des liens vers la même page de man Linux).Si vous voulez avoir un accès exclusif au clavier, c'est beaucoup plus compliqué.
Les claviers sont très périphériques complexes...
le truc, c'est que dans la plupart des cas vous ne pas envie de lire à partir du clavier en tant que tel - Gilles de répondre à des sommes assez bien (comme toujours :)). Et c'est pourquoi il est préférable de décrire le problème que vous essayez de résoudre - il pourrait s'avérer que vous n'êtes pas dirigé dans la meilleure direction.
Le problème est très simple. Ouvrir le clavier de l'appareil et de lire un octet à la fois. Pour prendre le contrôle du clavier de nous avoir pour stylo /dev/tty explicitement.
pas le clavier de l'appareil, elle est traitée à l'entrée (et n'a même pas besoin d'être un clavier local en cas, par exemple, de distance coquilles). C'est pourquoi j'ai écrit que en précisant votre problème pourrait aider - " - je besoin pour ouvrir le clavier de l'appareil" n'est pas le problème à résoudre - c'est plutôt quelque chose comme "j'ai besoin de lire le mot de passe de l'utilisateur d'un caractère d'entrée à un moment et il ne doit pas être fait l'écho sur l'écran" ou "j'ai besoin de saisir tous entrée du clavier". Donner plus de contexte, vous obtiendrez de meilleures réponses.
OriginalL'auteur peterph