
Responder1
A razão, como acontece com muitas coisas no mundo da computação, é a história e a compatibilidade com versões anteriores.
Nos kernels 2.4.*, antes udev
(a solução atual de sistema de arquivos virtual para /dev
) existir no Linux, havia duas soluções concorrentes, a "maneira Unix tradicional" de ter os dispositivos em um diretório real em um sistema de arquivos raiz, e devfs
, o primeiro virtual solução de sistema de arquivos para /dev
.
O problema era que o autor devfs
havia construído um esquema de nomenclatura completamente novo para vários dispositivos, e as pessoas tinham uma opinião bastante forte sobre isso: alguns queriam migrar para o novo esquema e abolir o antigo, outros não viam a necessidade de migração. Algumas distribuições usaram os antigos dispositivos estáticos, outras escolheram o devfs
.
Nesse ponto, havia um número fixo de dispositivos pseudo-TTY criados no momento da instalação. (A propósito, isso ainda é possível, se a CONFIG_LEGACY_PTYS
opção for definida durante a compilação do seu kernel.)
Em seguida, foram introduzidos dispositivos PTY alocados dinamicamente no estilo Unix98. Implementá-los em um /dev
diretório estático exigia um sistema de arquivos virtual /dev/pts
, e isso ficou conhecido como devpts
sistema de arquivos. Além disso, ter isso como um sistema de arquivos separado provavelmente tornaria possível aplicá-lo devfs
também sobre a dinâmica, sem duplicação de código.
Os dispositivos PTY alocados dinamicamente rapidamente se tornaram a escolha preferida, porque ter /dev
sobrecarregado centenas de dispositivos PTY alocados estaticamente, muitos dos quais poderiam nunca ser usados durante a vida útil do sistema, era claramente absurdo.
Depois veio o Linux 2.6 e udev
com ele. Rapidamente tornou obsoleta tanto a estática /dev
quanto devfs
as soluções. Por motivos de compatibilidade com versões anteriores, devpts
o sistema de arquivos ainda existia, mas agora a mesma funcionalidade poderia ser movida de volta para o /dev
sistema de arquivos principal, já que agora era inteiramente baseado em RAM.
Hoje, por exemplo, o Debian 9 ainda monta devpts
sistemas de arquivos /dev/pts
para compatibilidade herdada, mas não atribui /dev/pts/ptmx
nenhuma permissão por padrão - isso é um sinal de que o devpts
sistema de arquivos provavelmente está sendo obsoleto e será removido em algum momento futuro.
# ls -l /dev/ptmx /dev/pts/ptmx
crw-rw-rw- 1 root tty 5, 2 Nov 22 11:47 /dev/ptmx
c--------- 1 root root 5, 2 Nov 12 14:59 /dev/pts/ptmx
Se algum programa ainda precisar de /dev/pts/ptmx
, isso pode ser permitido ajustando as permissões padrão, mas isso permite que as pessoas saibam quais programas ainda estão usando o nome de dispositivo obsoleto mais antigo.
Responder2
Quando um processo abre /dev/ptmx (usandoposix_openpt()), ele obtém um descritor de arquivo para um mestre pseudoterminal (PTM) e um dispositivo escravo pseudoterminal (PTS) é criado no diretório /dev/pts.
Quando o mestre é aberto, o escravo é bloqueado. Você pode obter o nome do escravo e definir suas permissões, etc. e então desbloquear o escravo. Isto permite o controle do escravo antes que ele esteja acessível.
O escravo emula um dispositivo terminal de texto real, o mestre fornece os meios pelos quais um processo emulador de terminal controla o escravo.
O escravo é uma implementação virtual de um terminal físico e o mestre é uma implementação virtual da digitação humana nesse terminal; o computador trata os caracteres enviados ao escravo da mesma forma que se um humano os tivesse digitado em um terminal real (limitado pela configuração de permissão quando o mestre foi criado).