Como o Terminal e o Shell trocam dados?

5

No Linux, um Terminal está associado a um Shell. O Terminal envia entrada para o Shell (por exemplo: pwd ), e o Shell envia a saída de volta para o Terminal (por exemplo: /home/paul ).

Este diagrama mostra a relação entre um Terminal e um Shell (suponha que o Terminal que estou usando seja gnome-terminal e o Shell seja bash ):

Agora,oqueeuquerosaberéqualmecanismooTerminaleoShellusamparatrocardados.Issoéoqueeuachoqueacontece:

  • Quandognome-terminalforexecutado,elecriaráumarquivorepresentandoumaportaserialnodiretório/dev/pts(digamosqueonomedoarquivoseja/dev/pts/0).
  • gnome-terminalexecutaráoShellassociadoaele(porexemplo:bash),eirápassaronomedoarquivopts(onomedoarquivoptspodeserpassadoatravésdosargumentosdalinhadecomando,porexemplo).
  • Agora,gnome-terminalebashcomeçariamalerapartirde/dev/pts/0.
  • Quandognome-terminaldesejaenviardadosparabash,elesgravamessesdadosem/dev/pts/0ebashleriaessesdadosem/dev/pts/0.
  • Quandobashquiserenviardadosparagnome-terminal,elegravaráessesdadosem/dev/pts/0,andgnome-terminalleráessesdadosem/dev/pts/0.

Estediagramamostraoqueacabeideexplicar:

Estou correto em meu entendimento?

Nota : é claro que o arquivo pts poderia ser um arquivo tty se estivéssemos usando terminais virtuais (ou seja, quando não estamos usando uma GUI), mas a lógica seria ainda ser o mesmo.

    
por user7681202 27.04.2017 / 20:21

1 resposta

6

Você está perdendo uma peça necessária. Dispositivos pseudo-tty não são simétricos como soquetes. Existe um final mestre e um final escravo. Os arquivos em /dev/pts representam os dispositivos escravos.

O emulador de terminal cria uma pseudo-tty chamando openpty (ou forkpty que é openpty mais alguma configuração de bônus para o caso comum em que você deseja executar um novo processo em seu novo tty). Em um nível mais baixo, isso envolve abrir /dev/ptmx e fazer alguns truques mágicos.

Como resultado de chamar openpty , o emulador de terminal obtém um par de descritores de arquivos e também pode obter o nome do arquivo em /dev/pts correspondente ao escravo. O mestre não recebe um nome individual porque nunca há necessidade de um processo filho para abri-lo pelo nome.

Dispositivos mestre e escravo atuam como extremidades opostas de um soquete: o que você escreve em uma extremidade é lido da outra. Mas como esse é um tty, todos os modos tty são aplicados aos dados no caminho.

Por exemplo, se você é um emulador de terminal e recebe um pressionamento de tecla da tecla A , deve escrever 'a' no descritor de arquivo mestre. Isso é diretamente equivalente ao envio desse byte pela linha serial do terminal para o computador. Isso resultará em 'a' sendo lido do escravo (por qualquer programa que esteja lendo - por exemplo, o shell).

Se você receber um pressionamento de tecla da tecla D enquanto a tecla Ctrl estiver desligada, você deve escrever um 4 byte ( 'D' ^ 0x40 ) no arquivo mestre descritor. (Porque é isso que um terminal real envia no fio.) O que acontece a seguir depende do modo tty. No modo raw, o programa que lê o escravo tty verá um 4 byte. No modo cozido, o tty ativará o comportamento "EOF, tecla especial pressionada".

Na direção inversa, também há algum processamento. Quando algum programa grava '\n' no slave tty, você provavelmente receberá "\r\n" no descritor de arquivo mestre, devido a onlcr pós-processamento.

Seção Histórico, pule se entediado

Há muito tempo, os dispositivos escravos tinham nomes como /dev/ttyp0 e cada um tinha um mestre correspondente, como /dev/ptyp0 . Eles não foram criados dinamicamente. Um emulador de terminal poderia apenas analisar todos eles para encontrar um que não esteja em uso no momento e começar a usá-lo. Gerenciar propriedade e permissões foi um problema. xterm foi setuid-root apenas para poder fazer o escravo.

O novo esquema, chamado "UNIX98 ptys", manipula a criação e a propriedade do dispositivo por meio dos ioctls mágicos, portanto, os arquivos só aparecem em /dev/pts quando estão em uso e são de propriedade do usuário que executou o programa os criou.

    
por 27.04.2017 / 21:13