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.