Como funciona um terminal Linux?

32

Se você acionar um terminal e chamar um executável (assumindo que seja orientado por linhas por simplicidade), você obtém uma resposta ao comando do executável. Como isso é impresso para você (o usuário)? O terminal faz algo parecido pexpect? (pesquisa aguardando saída) ou o quê? Como é notificado sobre a saída a ser impressa? E como um terminal inicia um programa? (É algo parecido com os.fork () do python?) Estou intrigado com o funcionamento de um terminal, estou brincando com algum emulador de terminal e ainda não entendo como toda essa mágica funciona. Estou procurando a fonte do konsole (kde) e do yakuake (possivelmente usa o konsole) e não consigo entender onde toda essa mágica acontece.

Mike
fonte
6
Dê uma olhada em um emulador de terminal simples e um sistema operacional de brinquedo simples com um shell simples (e as primeiras quinze ou mais páginas do livro). Além disso, leia esta resposta para uma pergunta relacionada.
2
Este link também é interessante para a história assunto e tty terminal: linusakesson.net/programming/tty/index.php
@nwildner cool,
mike
1
Veja também o que está armazenado nos arquivos / dev / pts e podemos abri-los?
Gilles 'SO- stop be evil'

Respostas:

30

Originalmente, você tinha apenas terminais burros - no começo, na verdade, máquinas de escrever (semelhantes a uma máquina de escrever elétrica, mas com um rolo de papel) (daí / dev / tty - TeleTYpers), mas depois telas + combos de teclado - que acabavam de enviar um código-chave para o computador e o computador retornou um comando que escreveu a carta no terminal (ou seja, o terminal não tinha eco local, o computador teve que solicitar ao terminal que escrevesse o que o usuário digitou no terminal) - esse é um dos motivos por que tantos comandos Unix importantes são tão curtos. A maioria dos terminais era conectada por linhas seriais, mas (pelo menos) um era diretamente conectado ao computador (geralmente a mesma sala) - esse era o console. Apenas alguns usuários selecionados foram confiáveis ​​para trabalhar no "console" (esse costuma ser o único "terminal" disponível no modo de usuário único).

Mais tarde, houve também alguns terminais gráficos (os chamados "xterminais", que não devem ser confundidos com o xtermprograma), com tela e placa gráfica, teclado, mouse e um processador simples; o que poderia apenas executar um servidor X. Eles não fizeram nenhum cálculo, então os clientes X rodaram no computador ao qual estavam conectados. Alguns tinham discos rígidos, mas também podiam inicializar pela rede. Eles eram populares no início dos anos 90, antes dos PCs se tornarem tão baratos e poderosos.

Um "emulador de terminal" - a "janela do terminal" que você abre com programas como xtermou konsole- tenta imitar a funcionalidade desses terminais burros. Também programas como PuTTY(Windows) emulam terminais.

No PC, onde "o console" (teclado + tela) e "o computador" são mais uma unidade, você tem "terminais virtuais" (no Linux, as teclas Alt + F1 a Alt + F6), mas também imitar terminais de estilo antigo. Obviamente, com o Unix / Linux se tornando mais um sistema operacional de desktop usado frequentemente por um único usuário, agora você faz a maior parte do seu trabalho "no console", onde os usuários antes usavam terminais conectados por linhas seriais.


É claro que é o shell que inicia os programas. E ele usa o fork-systemcall (linguagem C) para fazer uma cópia de si mesmo com as configurações do ambiente; em seguida, o exec-systemcall é usado para transformar essa cópia no comando que você deseja executar. O shell é suspenso (a menos que o comando seja executado em segundo plano) até que o comando seja concluído. Como o comando herda as configurações de stdin, stdout e stderr do shell, o comando grava na tela do terminal e recebe entrada do teclado do terminal.

Baard Kopperud
fonte
E entre os terminais seriais mudos e o Xterms, havia en.wikipedia.org/wiki/Blit_(computer_terminal)
sendmoreinfo 16/13/13 /
31

Quando você “abre um terminal”, está iniciando um programa emulador de terminal, como xterm, gnome-terminal, lxterm, konsole,…

Uma das primeiras coisas que o emulador de terminal faz é alocar um pseudo terminal (geralmente chamado de pseudo-tty ou pty para abreviar). O pty é um par de arquivos de dispositivo de caractere : o pty master, que é o lado que o emulador de terminal abre, e o pty slave, que é o lado que os programas em execução no terminal abrem. Nas unidades mais modernas, o mestre é /dev/ptmx(que todo emulador de terminal tem aberto) e o escravo é /dev/pts/NUMBER. O driver do kernel para pseudo-terminais controla qual processo controla o mestre para cada dispositivo escravo. O emulador de terminal pode recuperar o caminho para o escravo correspondente por meio de um ioctl no dispositivo mestre.

Depois que o emulador de terminal abre o dispositivo mestre, ele inicia um subprocesso (normalmente um shell, mas cabe ao usuário que chamou o emulador de terminal decidir). O emulador faz isso da maneira usual para invocar um programa:

  • bifurque um processo filho,
  • abra o dispositivo slave pty nos descritores de arquivo 0, 1 e 2 (entrada padrão, saída padrão e fluxo de erros),
  • execute o shell ou outro programa no processo filho.

Quando a criança (ou qualquer outro processo) grava no escravo pty, o emulador vê a entrada no mestre pty.

Por outro lado, quando o emulador grava no dispositivo mestre, ele é visto como entrada no escravo.

Esperar funciona exatamente da mesma maneira. A diferença entre o Expect e um emulador de terminal como o xterm é onde eles obtêm a entrada que alimentam o programa (entrada de script versus teclado) e o que fazem com a saída (arquivo de log ou analisador versus desenho de texto em uma janela).

Gilles 'SO- parar de ser mau'
fonte
Um dos exemplos simples do que é descrito aqui é a implementação do scriptcomando do BusyBox , em que a xgetptyfunção é o núcleo do trabalho /dev/ptmx.
Ruslan #
@ Tim Eu aprecio que o inglês não seja sua língua nativa. Mas se você editar uma postagem, certifique-se de não errar. Se você não entender, não edite. Além disso, mais uma vez, não use negrito para destacar coisas que não precisam ser destacadas.
Gilles 'SO- stop be evil'