Como funciona um terminal Linux?

29

Se você acionar um terminal e chamar um executável (assumindo um que seja orientado para simplificar), você receberá uma resposta ao comando do executável. Como isso é impresso para você (o usuário)? O terminal faz algo como pexpect ? (poll esperando pela saída) ou o que? Como é notificado de saída para ser impresso? E como um terminal inicia um programa? (É algo parecido com os.fork () do python?) Estou intrigado como funciona um terminal, eu tenho jogado com algum emulador de terminal e eu ainda não entendo como funciona toda essa magia. Eu estou olhando para a fonte do konsole (kde) e yakuake (possivelmente usa o konsole) e não consigo chegar onde toda essa mágica acontece.

    
por mike 13.06.2013 / 23:21

2 respostas

29

Originalmente você tinha apenas terminais idiotas - no início, na verdade teletypewriters (semelhante a uma máquina de escrever elétrica, mas com um rolo de papel) (daí / dev / tty - TeleTYpers), mas depois screen + keyboard-combos - que acabou de enviar um código-chave para o computador e o computador mandou de volta um comando que escreveu a carta no terminal (ou seja, o terminal estava sem eco local, o computador tinha que ordenar que o terminal escrevesse o que o usuário digitou no terminal) - este é um da razão pela qual tantos comandos importantes do Unix são tão curtos. A maioria dos terminais era conectada por linhas seriais, mas (pelo menos) um era conectado diretamente ao computador (geralmente o mesmo local) - esse era o console. Apenas alguns usuários selecionados eram confiáveis para trabalhar no "console" (esse era o único "terminal" disponível no modo de usuário único).

Mais tarde, também houve alguns terminais gráficos (os chamados "xterminals", que não devem ser confundidos com o programa xterm ) com screen & cartão de tela gráfica, teclado, mouse e um processador simples; que poderia apenas executar um servidor X. Eles não faziam cálculos, então os clientes X rodavam 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 de terminal" que você abre com programas como xterm ou konsole - tenta imitar a funcionalidade de tais terminais burros. Também programas como PuTTY (Windows) emulam terminais.

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

É claro que o shell inicia os programas. E usa o fork-systemcall (linguagem C) para fazer uma cópia de si mesmo com um ambiente de configurações, 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 gravará na tela do terminal e receberá a entrada do teclado do terminal.

    
por 14.06.2013 / 01:27
28

Quando você “abre um terminal”, você está iniciando um programa de 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 breve). O pty é um par de arquivos de dispositivos de caracteres : o mestre pty, que é o lado em que o emulador de terminal abre, e o escravo pty, que é o lado que os programas rodando dentro do terminal estão abertos. Na maioria dos unices modernos, o mestre é /dev/ptmx (que todo emulador de terminal tem aberto) e o escravo é% código%. O driver do kernel para pseudo-terminais rastreia 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.

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

  • forçar um processo filho,
  • abra o dispositivo escravo nos descritores de arquivo 0, 1 e 2 (entrada padrão, saída padrão e fluxo de erro),
  • execute o shell ou outro programa no processo filho.

Quando o filho (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.

Esperamos que os trabalhos funcionem 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 (script vs entrada de teclado) e o que eles fazem com a saída (arquivo de log ou analisador versus texto de desenho em uma janela). p>     

por 14.06.2013 / 02:05