J'ai un appareil qui envoie des informations via USB à mon ordinateur. Arch Linux configure cet appareil en créant un fichier nommé ttyUSB0
dans /dev/
. J'utilise GTKterm
pour recevoir ces informations entrantes et les afficher dans une fenêtre de terminal émulée.
Ma question est la suivante: comment exactement GTKterm
lire / écrire dans ce ttyUSB0
fichier et où puis-je commencer à apprendre comment implémenter des fonctionnalités similaires? C'est-à-dire, dans la forme la plus élémentaire, comment pourrais-je écrire un caractère ttyUSB0
ou, au contraire, recevoir un octet et l'écrire dans un fichier?
screen
peut le faire, etminiterm
screen
et / ou parminiterm
programmation.Réponses:
Les ATS sont des fichiers que vous pouvez utiliser comme n'importe quel autre. Vous pouvez les ouvrir avec les outils standard d'ouverture de fichier de votre langue et lire ou écrire à partir d'eux. Ils ont un comportement spécial différent des fichiers "ordinaires", mais les bases sont les mêmes. Je couvrirai certains des cas spéciaux à la fin, mais d'abord, une expérience.
Une chose intéressante que vous pouvez faire directement depuis un terminal ordinaire. Exécutez
tty
et il imprimera une ligne comme:C'est l'appareil TTY sur lequel votre terminal fonctionne. Vous pouvez écrire quelque chose sur ce terminal:
Vous pouvez même en lire:
(
read X
est la commande "lire une ligne de l'entrée standard dans la variable X" de sh; le <consiste à utiliser / dev / pts / 2 comme entrée standard pour la commande de lecture; le premier "bonjour" que j'ai tapé et le second a été imprimé) .Si vous ouvrez un autre shell, par exemple en utilisant
screen
ouxterm
, vous pouvez exécuter runecho spooky > /dev/pts/2
dans ce shell pour faire apparaître le texte sur votre terminal d'origine, et la même chose pour les autres commandes. Tout cela n'est que votre shell ouvrant un fichier sans savoir qu'il s'agit d'un ATS.Voici un programme C très simple qui fait exactement ce que vous avez demandé et écrit un seul caractère dans / dev / pts / 3, puis en lit un seul octet:
Un véritable appareil TTY attaché à un shell ou à un émulateur de terminal aura un comportement intéressant, mais vous devriez récupérer quelque chose.
Pour accéder à un terminal, vous devez être autorisé à l'utiliser. Ce ne sont que les autorisations de fichier standard que vous voyez
ls -l
et définissez avecchmod
: vous avez besoin d'une autorisation de lecture pour ouvrir le fichier et le lire, et une autorisation d'écriture pour y écrire. Les ATS qui soutiennent votre terminal vous appartiendront, mais pas ceux d'un autre utilisateur, et les ATS pour les périphériques USB peuvent ou non l'être, selon votre configuration. Vous pouvez modifier les autorisations de la même manière que toujours.En ce qui concerne l'écriture d'un programme pour travailler avec lui, vous n'avez pas besoin de faire beaucoup de spécial. Vous pouvez voir dans l'exemple qu'une chose que vous n'avez pas besoin de faire est de fermer le fichier à chaque fois pour que vos données soient lues à l'autre extrémité: les fichiers TTY agissent comme des pipelines, poussant simplement les données dans les deux directions à mesure qu'elles entrent. Quand j'ai écrit du texte sur le TTY, il est apparu immédiatement, et quand je l'ai lu par la suite, rien ne m'attendait déjà. Ce n'est pas comme écrire dans un fichier normal où les données sont enregistrées sur le disque - elles sont transmises immédiatement de l'autre côté ou stockées en mémoire jusqu'à ce que quelqu'un les lise.
Vous voudrez peut-être utiliser la fonction de sélection pour pouvoir faire d'autres choses en attendant que l'appareil dise quelque chose, mais si vous êtes content d'attendre que les données passent, vous pouvez simplement utiliser des lectures de blocage et laisser le système d'exploitation faire le levage.
Une chose à garder à l'esprit est qu'il peut y avoir une taille de tampon limitée dans le noyau, et si vous écrivez beaucoup de données à la fois, vous pouvez finir par bloquer sans le vouloir. Si cela est susceptible d'être un problème, utilisez des E / S non bloquantes avec
open("/dev/...", O_RDWR | O_NONBLOCK)
. Le principe sera le même dans les deux cas.la source
sudo echo Hello > /dev/tty4
quand je suis dans l'environnement de bureau , mais je reçoisbash: /dev/tty4: Permission denied
si je ne suis pas connecté à tty4. Cependant, si je suis connecté à tty4, tout fonctionne bien. Quelle est la raison pour ça?ls -l /dev/tty4
> /dev/tty4
partie n'est pas une partie duecho
sous - processus démarré parsudo
mais une partie dusudo
processus lui-même, qui est exécuté par l'utilisateur actuel. les autorisations de fichier pour l'utilisateur actuel s'appliquent à la place de root.