web-dev-qa-db-fra.com

Comment fonctionne un terminal Linux?

Si vous allumez un terminal et appelez un exécutable (en supposant une ligne qui est orientée de la ligne de simplicité), vous obtenez une réponse à la commande de l'exécutable. Comment cela vous est-il imprimé (l'utilisateur)? Le terminal fait-il quelque chose comme pexpect? (sondage en attente de sortie) ou quoi? Comment est-il averti de la sortie à imprimer? Et comment un terminal démarre-t-il un programme? (Est-ce quelque chose de semblable à Os.Fork de Python ()?) Je suis intrigué comment un terminal fonctionne, je joue avec un émulateur de terminal et je ne comprends toujours pas comment toute cette magie fonctionne. Je regarde la source de Konsole (KDE) et Yakuake (éventuellement utilise Konsole) et je ne peux pas obtenir où tout cette magie se produit.

33
mike

À l'origine, vous n'aviez que des terminaux stupides - au début réellement des télétypes (semblables à une machine à écrire électrique, mais avec un rouleau de papier) (par conséquent/dev/tty - télétypes), mais ultérieur écran + clavier-combos - qui vient d'envoyer un code de clé à l'ordinateur et à l'ordinateur envoyé une commande qui a écrit la lettre sur le terminal (c'est-à-dire que le terminal était sans écho local, l'ordinateur a dû commander le terminal à écrire ce que l'utilisateur saisit sur le terminal) - c'est l'une des raisons. Pourquoi tant de commandes UNIX importantes sont si courtes. La plupart des terminaux étaient connectés par des lignes de série, mais (au moins) une fois directement connecté à l'ordinateur (souvent la même pièce) - c'était la console. Seuls quelques utilisateurs sélectionnés ont été appris à travailler sur "la console" (ceci était souvent le seul "terminal" disponible en mode mono-utilisateur).

Plus tard, il y avait également des terminaux graphiques (appelés "xterminaux", à ne pas confondre avec le programme xterm-.- PROGRAMME AVEC SCREEN & Graphical Screen-Card, Clavier, Mouse et un processeur simple; qui pourrait simplement exécuter un serveur x. Ils n'ont pas fait de calcul eux-mêmes, de sorte que les X-Clients ont couru sur l'ordinateur qu'ils étaient connectés à. Certains avaient des durcisses, mais ils pourraient également démarrer sur le réseau. Ils étaient populaires au début des années 90, avant que les PC ne soient si bon marché et puissants.

Un "émulateur de terminal" - la "fenêtre de terminal" que vous ouvrez avec des programmes tels que xterm ou konsole - essaie d'imiter les fonctionnalités de ces terminaux. Des programmes tels que PuTTY (Windows) imitent des terminaux.

Avec le PC, où "la console" (clavier + écran) et "l'ordinateur" est davantage d'une seule unité, vous avez des "bornes virtuelles" (sur Linux, touches alt + F1 via Alt + F6), mais elles aussi mimiquez des terminaux de style ancien. Bien entendu, avec UNIX/Linux devenant plus d'un système d'exploitation de bureau souvent utilisé par un utilisateur singulaire, vous faites maintenant la majeure partie de votre travail "à la console", où les utilisateurs avant utilisation de terminaux utilisés par des lignes de série.


C'est bien sûr la coquille qui commence les programmes. Et il utilise le Fork-SystemCall (langage C) pour effectuer une copie de lui-même avec un environnement d'environnement, alors l'exécutant SystemCall est utilisée pour activer cette copie dans la commande que vous vouliez exécuter. La coque suspend (sauf si la commande est exécutée en arrière-plan) jusqu'à ce que la commande se termine. Comme la commande hérite des paramètres de STDIN, STDOUT et STDERR à partir de la coque, la commande écrira sur l'écran du terminal et recevra l'entrée du clavier du terminal.

31
Baard Kopperud

Lorsque vous "Ouvrez un terminal", vous démarrez un programme d'émulateur de terminal, tel que Xterm, Gnome-Terminal, LXTERM, Konsole, ...

L'une des premières choses que l'émulateur de terminal fait est d'allouer un Pseudo Terminal (souvent appelé pseudo-trty, ou pty à court). La PTY est une paire de fichiers de périphérique de caractère : le maître PTY, qui est le côté que l'émulateur de terminal s'ouvre et l'esclave PTY, qui est le côté que les programmes fonctionnant à l'intérieur du terminal sont ouverts. Sur la plupart des unes modernes, le maître est /dev/ptmx (quel émulateur terminal a ouvert) et l'esclave est /dev/pts/NUMBER. Le pilote de noyau pour les pseudo-terminaux gardez une trace de quel processus contrôle le maître de chaque périphérique esclave. L'émulateur de terminal peut récupérer le chemin d'accès à l'esclave correspondant via un ioctl sur le dispositif maître.

Une fois que l'émulateur du terminal a ouvert le périphérique maître, il commence une sous-processus (généralement une coque, mais il appartient à l'utilisateur qui a invoqué l'émulateur de terminal à décider). L'émulateur le fait de la manière habituelle d'invoquer un programme:

  • fourche un processus enfant,
  • ouvrez le périphérique esclave PTY sur des descripteurs de fichier 0, 1 et 2 (entrée standard, sortie standard et flux d'erreur),
  • exécuter la coque ou autre programme dans le processus d'enfant.

Lorsque l'enfant (ou tout autre processus) écrit à l'esclave PTY, l'émulateur voit une entrée sur le maître PTY.

Inversement, lorsque l'émulateur écrit sur le dispositif principal, il est considéré comme une entrée sur l'esclave.

Attendre des œuvres exactement de la même manière. La différence entre attendu et un émulateur terminal tel que Xterm est d'où elles obtiennent l'entrée qu'ils nourrissent le programme (script vs clavier entrée) et ce qu'ils font avec la sortie (fichier journal ou test de dessin parser vs dans une fenêtre).