De acordo com o meu conhecimento, os /dev/pts
arquivos são criados para sessões ssh ou telnet.
tty
.
De acordo com o meu conhecimento, os /dev/pts
arquivos são criados para sessões ssh ou telnet.
tty
.
Respostas:
Nada é armazenado /dev/pts
. Este sistema de arquivos vive puramente na memória.
As entradas /dev/pts
são pseudo-terminais (pty para abreviar). Os kernels Unix têm uma noção genérica de terminais . Um terminal fornece uma maneira para os aplicativos exibirem saída e receberem entrada através de um dispositivo terminal . Um processo pode ter um terminal de controle - para um aplicativo em modo texto, é assim que ele interage com o usuário.
Os terminais podem ser terminais de hardware ("tty", abreviação de "teletype") ou pseudo-terminais ("pty"). Os terminais de hardware estão conectados através de alguma interface, como uma porta serial ( ttyS0
,…) ou USB ( ttyUSB0
,…) ou através de uma tela e teclado do PC ( tty1
,…). Os pseudo-terminais são fornecidos por um emulador de terminal, que é um aplicativo. Alguns tipos de pseudo-terminais são:
Se um programa abrir um terminal para gravação, a saída desse programa aparecerá no terminal. É comum ter vários programas emitindo para um terminal ao mesmo tempo, embora isso possa ser confuso às vezes, pois não há como saber qual parte da saída veio de qual programa. Os processos em segundo plano que tentam gravar em seu terminal de controle podem ser automaticamente suspensos 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 lendo do 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 do terminal de controle enquanto não estão em primeiro plano são automaticamente suspensos por um sinal SIGTTIN .
Para experimentar, execute tty
um terminal para ver qual é o dispositivo do terminal. Vamos dizer que é /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 o outro terminal. Para eliminar esse cat
comando (o que tornará o outro terminal difícil de usar), pressione Ctrl+ C.
Gravar em outro terminal é ocasionalmente útil para exibir uma notificação; por exemplo, o write
comando faz isso. A leitura de outro terminal normalmente não é feita.
strace
ler a entrada do programa, mas é isso.
tostop
sinalizador tty estiver definido. Este sinalizador não está definido por padrão. E eu estou corrigido na leitura do anoter TTY. Eu tentei e funciona, mas é por leitura, não por caractere (quando sentado em um prompt de shell, eles são iguais aos shells que lêem 1 caractere por vez). Talvez seja bom esclarecer esse ponto, pois é assim que interpretei sua resposta.
read
chamada retornará apenas caracteres consecutivos (ou melhor, bytes, devo dizer), mas o aplicativo não tem controle sobre quantos bytes uma read
chamada retornará, por isso não é melhor.
Os arquivos /dev/pts
são "pseudo-ttys". Eles são como pipes nomeados até certo ponto, mas também imitam terminais de conexão serial antigos, como o 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 explicita: o kernel não armazena nada, /dev/pts/0
por exemplo. Somente fluxos de bytes do stdout de um programa conectado à pseudo-tty entram e programas cujo stdin está conectado à mesma pseudo-tty lê esses bytes.
Os pseudo-ttys também colocam uma camada de indireção nesses fluxos de bytes. O kernel pode inspecionar bytes para 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 final de arquivo em stdin ou apagar uma linha na entrada. Também há uma função de buffer em algum lugar, então meu "nada armazena" está um pouco errado, mas apenas em alguns kilobytes.
O kernel pode inspecionar valores de bytes na saída e fazer coisas como transformar uma nova linha (avanço de linha ASCII, LF ou "\n"
) em dois bytes, retorno de carro e avanço de linha (CRLF ou "\r\n"
), ou quaisquer bytes que um hardware de terminal serial exigir. A indireção de uma pseudo-tty permite a independência do hardware.
Os pseudo-ttys também permitem todas as ioctl()
chamadas "taxa de transmissão definida", "paridade de conjunto" e assim por diante , e provavelmente não fazem nada com elas. Isso permite que os programas que foram gravados no dia dos VT-100s, ADM-3 e Wyse, o que quer que seja, continuem funcionando sem erros. 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.
O Linux e muitos Unixes têm pseudo-ttys. O plano 9 não. Os pseudo-ttys são uma relíquia que sobrou dos dias dos terminais de hardware conectados por cabo serial.
/dev/
é um diretório especial para arquivos de dispositivos. Essas são abstrações, não são arquivos reais no 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 um daemon do espaço do usuário udevd
.
Muitos dos dispositivos assim representados são virtuais. Isso inclui as entradas /dev/pts
, que são dispositivos de console. É por isso que um é criado para sessões remotas; eles também são criados quando você abre um terminal da GUI local.
Você pode abri-los como arquivos, embora não tenha muito valor de uso. Para obter o /dev/pts
nó em que 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
Em seguida, tente usar o shell em / dev / pts / 4. Você fica preso até sair do cat
outro lado, mas a maioria do que você digita em pts / 4 passa (por exemplo, tentando "olá mundo", acabei hl
em pts / 4 e ello word
no cat
console).
Meu palpite aqui é que o dispositivo está recebendo informações do shell e produzindo-as através do sistema, que é como as coisas acabam na tela - o shell não está lidando com hardware, o sistema está. Tente strace bash
(e dê uma olhada man strace
se você não sabe 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 padrão o shell está conectado? Agora tente strace
no seu terminal da 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 muitas poll()
e recvfrom()
. Não vejo gravações, mas se você usar o cat
truque de outro terminal, notará que, quando digitar, os pressionamentos de tecla que são lidos por cat não causam nenhuma resposta na saída do strace - o terminal não está ' t os recebendo. Portanto, o aplicativo de terminal da GUI e o gato estão competindo para ler a partir do mesmo dispositivo, no qual o shell está enviando.
echo Hello > /dev/pts/1
... Veja o que acontece, é o seu terminal.