
Com base no que li sobre pseudoterminais no Linux, existem dois tipos de pseudoterminais:Pseudoterminais estilo BSD(que está obsoleto) ePseudoterminais UNIX 98.
Criei duas imagens que mostram minha compreensão desses dois tipos de pseudoterminais.
A imagem a seguir mostra como funcionam os pseudoterminais estilo BSD (corrija-me se a imagem estiver errada):
Este tipo de pseudoterminais não é difícil de entender, cada terminal está conectado a um driver mestre único.
Mas nos pseudoterminais UNIX 98, as coisas são um pouco mais confusas. A imagem a seguir mostra como acho que esse tipo de pseudoterminal funciona:
Basicamente, todos os terminais usam o mesmo driver mestre ( /dev/ptmx
), mas não tenho certeza de como o driver mestre sabe fazer o seguinte:
Se os dados estão sendo enviados de um dos processos do terminal, como o driver mestre sabe para qual driver escravo TTY os dados devem ser passados?
Se os dados estiverem sendo enviados de um dos drivers escravos TTY, como o driver mestre sabe para qual processo de terminal os dados devem ser passados?
O driver mestre sabe como fazer isso da maneira que mostrei na imagem (ou seja, o driver mestre possui uma tabela de mapeamento que mapeia cada PID do terminal para seu driver escravo TTY correspondente)?
Responder1
Você é curiosamente fascinado por nomes. /dev/ptmx
não é um "driver", é apenas um nome no sistema de arquivos, que tem um significado especial.
Um processo abre um novo mestre chamando posix_openpt()
, que retorna um descritor de arquivo; o mesmo efeito pode ser alcançado open()
invocando /dev/ptmx
. Cada vez que um processo open()
chama /dev/ptmx
umnovopseudoterminal é criado; o pseudoterminal é destruído quando não há mais processos com este descritor de arquivo aberto. Este descritor de arquivo refere-se ao lado mestre do pseudoterminal e pode ser passado para processos descendentes como qualquer outro descritor de arquivo.
Para informações mais detalhadas consulteunix.stackexchange.com/questions/117981. (Gorjeta para @JdeBP pela sugestão.)
Uma vez que um processo possui um descritor de arquivo referente a um lado mestre do pseudoterminal, ele pode descobrir o nome do lado escravo do pseudoterminal chamando ptsname()
, e pode passar esse nome para qualquer processo que queira controlar através do pseudoterminal.