O que é armazenado nos arquivos / dev / pts e podemos abri-los?

67

De acordo com o meu conhecimento, /dev/pts arquivos são criados para sessões ssh ou telnet.

    
por user2720323 04.10.2013 / 08:59

3 respostas

94

Nada é armazenado em /dev/pts . Este sistema de arquivos vive exclusivamente na memória.

As entradas em /dev/pts são pseudo-terminais (pty para breve). Os kernels Unix têm uma noção genérica de terminais . Um terminal fornece uma maneira de os aplicativos exibirem a saída e receberem entrada por meio de um dispositivo terminal . Um processo pode ter um terminal de controle - para um texto modo de aplicação, é assim que interage com o usuário.

Os terminais podem ser terminais de hardware (“tty”, abreviação de “teletipo”) ou pseudo-terminais (“pty”). Os terminais de hardware são conectados em alguma interface, como uma porta serial ( ttyS0 ,…) ou USB ( ttyUSB0 ,…) ou em uma tela de PC e teclado ( tty1 ,…). Pseudo-terminais são fornecidos por um emulador de terminal, que é uma aplicação. Alguns tipos de pseudo-terminais 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 de tela e relé tmux e saída de e para outro terminal, para separar aplicativos de modo de texto do terminal real.
  • Aplicativos de shell remotos, como sshd, telnetd, rlogind,… retransmitem entrada e saída entre um terminal remoto no cliente e um arquivo no servidor.

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 suspensos automaticamente por um sinal SIGTTOU .

Se um programa abrir 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 de seu terminal de controle enquanto não estão no primeiro plano são < a href="http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap11.html#tag_11_01_04"> automaticamente suspenso por um sinal SIGTTIN .

Para experimentar, execute tty em um terminal para ver o que é 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 o outro terminal. Para matar o comando cat (o que tornará o outro terminal difícil de usar), pressione Ctrl + C .

Escrever em outro terminal é ocasionalmente útil para exibir uma notificação; por exemplo, o comando write faz isso. Ler de outro terminal não é feito normalmente.

    
por 05.10.2013 / 03:46
15

Os arquivos em /dev/pts são "pseudo-ttys". Eles são como pipes nomeados até certo ponto, mas também imitam antigos terminais de conexão serial, como os VT-100. 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 em /dev/pts/0 por exemplo. Apenas fluxos de bytes da stdout de um programa conectado à pseudo-tty entram, e programas cujo stdin está conectado à mesma pseudo-tty lêem 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, veja man stty , e envie um SIGINT, defina o fim de arquivo no stdin , ou apagar uma linha na entrada.Há também uma função de buffer em algum lugar, então meu "armazena nada" é um pouco errado, mas apenas por alguns kilobytes.

O kernel pode inspecionar os valores de bytes na saída e fazer coisas como transformar uma nova linha (alimentação de linha ASCII) em dois bytes, retorno de carro e alimentação de linha, ou quaisquer bytes que um hardware de terminal serial exija. A indireção de uma pseudo-tty permite a independência do hardware.

Os pseudo-ttys também permitem todas as "taxas de transmissão definidas", "paridade de conjuntos" e assim por diante ioctl() chamadas do sistema, e provavelmente não fazem nada com elas. Isso permite que os programas que foram gravados no dia dos VT-100, ADM-3 e Wyse continuem funcionando sem erros. Software, o driver de dispositivo psuedo-ttys, age como hardware.

Os 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. Os pseudo-ttys são um pouco de relíquia, remanescentes dos dias dos terminais de hardware conectados por cabo serial.

    
por 04.10.2013 / 15:55
10

/dev/ é um diretório especial para arquivos de dispositivos. Estas são abstrações, elas não são arquivos reais no disco. O diretório é preenchido na inicialização e está 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 de usuário, udevd .

Muitos dos dispositivos representados são virtuais. Isso inclui as entradas em /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 GUI local.

Você pode abri-los como arquivos, embora não tenha muito valor de uso. Para obter o nó /dev/pts , seu shell está conectado, use tty :

> tty
/dev/pts/4

Agora mude para outro console e tente:

> echo "duck!" > /dev/pts/4

Inteligente. Agora tente:

> cat /dev/pts/4

Em seguida, tente usar o shell em / dev / pts / 4. Você está preso até sair do cat do outro lado, mas a maior parte do que você digita nos pts / 4 vai passar (por exemplo, tentando "hello world" acabei com hl em pts / 4 e ello word no console cat .

Meu palpite é que o dispositivo está recebendo entrada do shell, e produzindo-o via sistema, que é como as coisas acabam na tela - o shell não está lidando com hardware, o sistema é. Tente strace bash (e dê uma olhada em 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 para saída padrão. Mas qual é o padrão da casca conectado? Agora, experimente strace no seu terminal da GUI - você terá que descobrir o nome se não souber, por exemplo no KDE é konsole e o GNOME tem gnome-terminal , eu acredito. A saída desse strace é provavelmente mais enigmática - o meu tem muito poll() e recvfrom() . Eu não vejo nenhuma gravação, mas se você agora puxar o truque cat de outro terminal, você notará que quando digita, os pressionamentos de tecla que são lidos pelo gato não causam resposta alguma na saída strace - o terminal não está recebendo-os. Assim, o aplicativo do terminal da GUI e o gato estão competindo para ler o mesmo dispositivo em que o shell está sendo enviado.

    
por 04.10.2013 / 09:49