Pelo que sei, /dev/pts
os arquivos são criados para sessões ssh ou telnet.
Responder1
Nada é armazenado em /dev/pts
. Este sistema de arquivos reside puramente na memória.
As entradas /dev/pts
sãopseudo-terminais(pty para abreviar). Os kernels Unix têm uma noção genérica determinais. Um terminal fornece uma maneira para os aplicativos exibirem saídas e receberem entradas através de umdispositivo terminal. Um processo pode ter umterminal de controle— para uma aplicação em modo texto, é assim que ela interage com o usuário.
Os terminais podem ser terminais de hardware (“tty”, abreviação de “teletipo”) ou pseudoterminais (“pty”). Os terminais de hardware são conectados através de alguma interface, como uma porta serial ( ttyS0
, …) ou USB ( ttyUSB0
, …) ou através de uma tela e teclado de PC ( tty1
, …). Os pseudoterminais são fornecidos por um emulador de terminal, que é um aplicativo. Alguns tipos de pseudoterminais são:
- Aplicativos GUI como xterm, gnome-terminal, konsole,… transformam eventos de teclado e mouse em entrada de texto e exibem a saída graficamente em alguma fonte.
- Aplicativos multiplexadores, como entrada e saída de relé de tela e tmux de e para outro terminal, para desacoplar aplicativos em modo de texto do terminal real.
- Aplicativos shell remotos, como sshd, telnetd, rlogind,… retransmitem entrada e saída entre um terminal remoto no cliente e um pty no servidor.
Se um programa abrir um terminal para escrita, a saída desse programa aparecerá no terminal. É comum ter vários programas sendo enviados para um terminal ao mesmo tempo, embora isso às vezes possa ser confuso, pois não há como saber qual parte da saída veio de qual programa. Processos em segundo plano que tentam gravar em seu terminal de controle podem sersuspenso automaticamente por um sinal SIGTTOU.
Se um programa abre um terminal para leitura, a entrada do usuário é passada para esse programa. Se vários programas estiverem sendo lidos no mesmo terminal, cada caractere será roteado independentemente para um dos programas; isso não é recomendado. Normalmente há apenas um único programa lendo ativamente do terminal em um determinado momento; programas que tentam ler de seu terminal de controle enquanto não estão noprimeiro planosãosuspenso automaticamente por um sinal SIGTTIN.
Para experimentar, execute tty
em um terminal para ver qual é o dispositivo terminal. Digamos que seja /dev/pts/42
. Em um shell em outro terminal, execute echo hello >/dev/pts/42
: a string hello
será exibida no outro terminal. Agora execute cat /dev/pts/42
e digite no outro terminal. Para encerrar esse cat
comando (o que dificultará o uso do outro terminal), pressione Ctrl+ C.
Escrever para outro terminal é ocasionalmente útil para exibir uma notificação; por exemplo owrite
comando faz isso. A leitura de outro terminal normalmente não é feita.
Responder2
Os arquivos /dev/pts
são "pseudo-ttys". Até certo ponto, eles são como tubos nomeados, mas também imitam antigos terminais de conexão serial, como os VT-100s. Os pseudo-ttys fazem o trabalho de transferir bytes do teclado para o programa e do programa para o dispositivo de saída, o que parece simples. Mas isso responde à sua pergunta explícita: o kernel não armazena nada, /dev/pts/0
por exemplo. Somente fluxos de bytes do stdout de um programa conectado ao pseudo-tty entram, e os programas cujo stdin está conectado ao mesmo pseudo-tty leem esses bytes.
Os pseudo-ttys também colocam uma camada de indireção nesses fluxos de bytes. O kernel pode inspecionar bytes em busca de valores especiais como "Control-C" ou "Control-D" ou "Control-U" (que são todos configuráveis, consulte man stty
) e enviar um SIGINT, definir fim de arquivo em stdin ou apagar uma linha na entrada. Há também uma função de buffer em algum lugar, então meu "não armazena nada" está um pouco errado, mas apenas por alguns kilobytes.
O kernel pode inspecionar valores de bytes na saída e fazer coisas como transformar uma nova linha (ASCII linefeed, LF ou "\n"
) em dois bytes, retorno de carro e linefeed (CRLF ou "\r\n"
), ou quaisquer bytes que um hardware de terminal serial exija. A indireção de um pseudo-tty permite independência do hardware.
Pseudo-ttys também permitem todas as chamadas de sistema "definir taxa de transmissão", "definir paridade" e assim por diante ioctl()
, e provavelmente não fazem nada com elas. Isso permite que programas que foram escritos na época dos VT-100s, ADM-3 e Wyse continuem funcionando sem erros. O software, o driver de dispositivo pseudo-ttys, atua como hardware.
Pseudo-ttys podem ser usados por sshd
e telnet
, mas também são usados entre um emulador de terminal (como xterm
ou rxvt
) e o shell que normalmente é executado dentro do xterm.
Linux e muitos Unixes possuem pseudo-ttys. O Plano 9 não. Pseudo-ttys são uma espécie de relíquia, que sobrou dos dias dos terminais de hardware conectados por cabo serial.
Responder3
/dev/
é um diretório especial para arquivos de dispositivos. Estas são abstrações, não são arquivos reais em disco. O diretório é preenchido na inicialização e sujeito a alterações para refletir as interfaces de dispositivos existentes, que são criadas e destruídas pelo kernel e por um daemon de espaço do usuário, udevd
.
Muitos dos dispositivos assim representados são virtuais. Isso inclui as entradas em /dev/pts
, que são dispositivos de console. É por isso que um foi criado para sessões remotas; eles também são criados quando você abre um terminal GUI local.
Você pode abri-los como arquivos, embora não tenha muito valor útil. Para obter o /dev/pts
nó ao qual seu shell está conectado, use tty
:
> tty
/dev/pts/4
Agora mude para outro console e tente:
> echo "duck!" > /dev/pts/4
Esperto. Agora tente:
> cat /dev/pts/4
Então tente usar o shell em /dev/pts/4. Você fica preso até sair cat
do outro lado, mas a maior parte do que você digita em pts/4 passará (por exemplo, tentando "olá mundo" que acabei hl
em pts/4 e ello word
no cat
console).
Meu palpite aqui é que o dispositivo está recebendo informações do shell e enviando-as através do sistema, e é assim que as coisas acabam na tela - o shell não está lidando com hardware, mas sim com o sistema. Experimente strace bash
(e dê uma olhada man strace
se não souber o que é); você recebe uma enxurrada preliminar de chamadas quando o bash é iniciado. Agora comece a pressionar as teclas:
read(0, "h", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "e", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "y", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
Para cada letra digitada há uma leitura da entrada padrão e uma gravação na saída padrão. Mas a que está conectado o padrão do shell? Agora experimente strace
no seu terminal GUI - você terá que descobrir o nome se não o souber, por exemplo, no KDE é konsole
, e o GNOME tem o gnome-terminal
, eu acredito. A saída disso strace
é provavelmente mais enigmática - a minha tem muitos poll()
e recvfrom()
. Não vejo nenhuma gravação, mas se você agora usar o cat
truque de outro terminal, notará, ao digitar, que os pressionamentos de tecla lidos por cat não causam nenhuma resposta na saída do strace - o terminal é ' não os recebo. Portanto, o aplicativo do terminal GUI e o gato estão competindo para ler no mesmo dispositivo para o qual o shell está sendo enviado.