devpts

Origem: Wikipédia, a enciclopédia livre.
Estrutura simplificada do núcleo do Linux: Terminais e controladores de dispositivo de caractere, também conhecidos como "subsistema TTY".

devpts é um sistema de arquivos virtual no núcleo do Linux a partir da versão 2.1.93 (abril de 1998). Ele é normalmente montado em /dev/pts e contém unicamente arquivos de dispositivo que representam escravos para a multiplexação mestre localizada em /dev/ptmx.[1]

A criação do devpts resultou do desejo de abandonar a necessidade de um programa auxiliador para setuid, como por exemplo /usr/libexec/pt_chown. Ele é uma implementação distinta da ideia de pseudoterminal. A implementação anterior fornecia um número fixo de pares mestre/escravo que possuíam nós de dispositivo permanentes, por exemplo o par mestre-escravo /dev/ptyp63 e /dev/ttyp83, cf. The Linux Programming Interface, capítulo 62 "Terminals" e capítulo 64 "Pseudoterminals".

Um pseudoterminal ("pseudo TTY" ou "PTY") é um par de pseudodispositivos - um escravo e um mestre - que fornece um tipo especial de canal de comunicação. O pseudodispositivo escravo emula um terminal de texto de computador físico, como, por exemplo, o DEC VT100, que pode ler e escrever texto como se fosse um terminal físico. O pseudodispositivo mestre fornece os meios pelos quais um programa fornecendo uma interface de usuário baseada em texto age com e controla seu escravo. Programas amplamente difundidos com uma interface de usuário baseada em texto são chamados de emuladores de terminal, como, por exemplo, o xterm, gnome-terminal ou Konsole, ou programas usando SSH ou telnet. Escrever para o mestre é exatamente similar a digitar em um terminal, assim o pseudodispositivo mestre age como a pessoa sentada na frente do terminal de texto do computador físico.

Um par pseudoterminal é similar a um conduíte bidirecional. Tudo que é escrito no mestre aparece como entrada no escravo e tudo que é escrito no escravo aparece como entrada no mestre. Assim como conduítes, pseudoterminais possuem uma capacidade limitada. No Linux, a capacidade do pseudoterminal é em torno de 4 KiB em cada direção.

Um típico sistema operacional baseado no núcleo do Linux fornece muitos PTYs para suportar interfaces baseadas em texto, como fornecidas pelos emuladores de terminal (como xterm ou gnome-terminal), e interfaces de acesso remoto como SSH.

História da implementação[editar | editar código-fonte]

Em fevereiro de 1998, o Linux 2.1.87 trouxe suporte para o dispositivo mestre de multiplexação /dev/ptmx.[2] Abrir este dispositivo fornece acesso a um pseudomestre TTY diferente não usado e permite que o escravo correspondente seja identificado usando um ioctl(). Em abril daquele ano, o Linux 2.1.93 adicionou um novo sistema de arquivos virtual chamado de devpts que normalmente é montado em /dev/pts. Sempre que um novo par mestre/escravo é criado, um nó de dispositivo para o escravo é criado nesse sistema de arquivos virtual.

Para facilitar a transferência da emulação de terminal para a terra do usuário, mantendo o subsistema TTY (gerenciamento de sessão e disciplina de linha) intacto, o pseudoterminal foi inventado.[3]

A razão pela qual a disciplina de linha está dentro do kernel, é para evitar mudanças de contexto na recepção de cada caractere (o que, nos primórdios das memórias de pequeno núcleo, implicaria no tráfego de trocas, vários swap-out e swap-in). Portanto, a disciplina de linha mantém em um buffer de kernel uma linha de entrada, e como é simples o suficiente testar um byte específico e decrementar um contador para implementar a backspace "editing" (e algumas outras funções de edição simples), ele é feito lá.

A alternativa é usar o modo raw, no qual os caracteres são encaminhados para o aplicativo assim que são recebidos, o que é necessário para editores mais sofisticados, como o conhecido Emacs (na época). E, de fato, como o emacs tinha que usar esse modo bruto, o que implica uma mudança de contexto na recepção de cada caractere digitado, ele fazia constantes trocas (swaps) quando os computadores não tinham memória suficiente para manter o emacs e todos os outros programas no núcleo.

Com a adição de pseudoterminais (PTYs), o código TTY também se tornou uma espécie de mecanismo de comunicação entre processos, com toda a estranha semântica TTY preservada. O código TTY também precisa suportar protocolos de rede como o PPP sem criar gargalos de desempenho.[4]

Referências

  1. Neil Brown (1 de junho de 2016). «Containers, pseudo TTYs, and backward compatibility». LWN.net 
  2. diff of /drivers/char/pty.c
  3. Linux Akesson. «The TTY demystified» 
  4. Jonathan Corbet (29 de julho de 2009). «A tempest in a tty pot». LWN.net