Posso acessar o arquivo do terminal?

0

Em 1970, tínhamos terminais de hardware CUI.

Agora, na minha caixa de Linux, vejo sete emuladores de terminal, onde a GUI ocupa o emulador de terminal (Ctrl + Alt + F7).

Por exemplo, este é meu primeiro terminal (Ctrl + Alt + F1) emulador

$ tty
/dev/tty0

Em >cat ENTER no espaço do usuário, cat process espera em stdin para receber entrada do arquivo /dev/tty0 . Não consegui visualizar o arquivo /dev/tty0 usando qualquer editor.

Os processos stdin e stdout de cat estão funcionando com o arquivo /dev/tty0 .

Pergunta:

Usando algum editor, este arquivo de terminal é /dev/tty0 acessível no espaço do usuário?

    
por overexchange 09.04.2017 / 00:48

4 respostas

5

Você está acessando o arquivo do terminal o tempo todo. Mas isso não faz o que você provavelmente acha que faz.

Quando você escreve em um arquivo de disco, e depois lê a partir dele, o que você lê é o que você escreveu. Este não é o caso de arquivos especiais como terminais. Um arquivo é algo que pode ser gravado e lido de¹; o link entre o que é gravado e o que é lido depende da natureza do arquivo. Com um arquivo de dispositivo de personagem, geralmente não há nenhum link.

Os arquivos de terminal conectam duas entidades que desempenham papéis diferentes: o próprio terminal e um aplicativo que deseja interagir com um usuário. O terminal pode ser uma peça de hardware, representada pelo kernel, ou um emulador de terminal, que é um processo. Quando o aplicativo grava dados, o terminal começa a lê-lo (e normalmente o exibe para o usuário de alguma forma); quando o aplicativo lê dados, os dados vêm do terminal (normalmente isso é entrada do usuário).

No seu caso, o aplicativo é sucessivamente o shell, o gato, o editor, etc. O editor pode tentar ler do terminal, mas se estiver, ele está aguardando sua entrada, e pode ou não reagir apropriadamente ao fim da entrada (que você sinalizaria pressionando Ctrl + D no início de uma linha). Mais uma vez, a leitura do terminal não fornecerá as coisas que foram saída para o terminal.

No caso de um console, os dados gravados no terminal são desenhados na tela. Com os consoles do Linux, o texto exibido em /dev/tty1 pode ser lido no dispositivo /dev/vcs1 desde que permaneça exibível (para que você obtenha apenas o que é exibido na tela, mais o que ainda está disponível rolando de volta; qualquer coisa que não seja alcançável rolando de volta é perdida para sempre).

Note que esta é uma facilidade oferecida pela interface do terminal Linux. Um terminal poderia simplesmente desenhar os pixels e esquecer o texto. A maioria dos emuladores de terminal não oferece nenhuma instalação semelhante.

¹ A maioria dos arquivos é assim, na verdade, mas não todos. Os diretórios não podem ser escritos através da interface normal e, em muitas variantes unix, também não podem ser lidos. Alguns dispositivos não suportam leitura ou gravação, apenas ioctl .

    
por 09.04.2017 / 01:57
3

Sim, no entanto, o arquivo de terminal não é um arquivo normal.

Se você listar as propriedades estendidas de um arquivo de terminal, verá:

$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr  6 13:07 /dev/tty1

observe que o primeiro caractere na seção de permissão é uma letra "c", isso indica que o arquivo é um dispositivo especial de caractere. Em contraste, um arquivo regular teria um "-" lá, um diretório um "d", um dispositivo especial de bloco um "b", um link simbólico um "l" e um soquete de domínio unix um "s". / p>

É importante notar que em sistemas Unix como o Linux, um sistema de arquivos é mais parecido com um namespace para interações com o objeto kernel, onde você pode nomear vários objetos do kernel para que eles possam ser referenciados inequivocamente por várias partes do sistema. Esses objetos do kernel não são apenas arquivos regulares que são suportados pelo armazenamento persistente, mas também coisas como dispositivos de hardware, ou soquetes, etc.

Um dispositivo especial de caractere é um objeto do kernel que faz interface com o espaço do usuário lendo e gravando fluxos de caracteres, eles são acessados fazendo read() e write() chamada do sistema.

Por exemplo, na minha máquina com Ctrl + Alt + F1 (que é / dev / tty1 na minha máquina, não tty0), eu poderia ler o que estiver sendo digitado no console virtual usando um programa que use o read() syscall como cat :

  1. No emulador gráfico, sudo cat /dev/tty1
  2. Alterne para o emulador de console virtual com Ctrl + Alt + F1
  3. Digite alguma coisa no emulador do console virtual
  4. Volte para a interface gráfica com Ctrl + Alt + F7
  5. No emulador gráfico, eu veria tudo o que eu digitei no emulador de console virtual como a saída de cat

Por outro lado, também posso exibir caracteres no console virtual usando um programa que usa write() syscall como tee :

  1. No emulador gráfico, echo "hello world" | sudo tee /dev/tty1
  2. Alterne para o emulador de console virtual com Ctrl + Alt + F1
  3. No emulador do console virtual, eu veria "olá mundo"

A maioria dos editores de texto regulares se recusará a abrir arquivos especiais não regulares, porque eles estão programados para verificar o tipo de arquivo e se recusam a editar arquivos não regulares. Isso é para evitar "acidentes" porque faz pouco sentido editar dispositivos especiais em editores de texto comuns. Além disso, a maioria dos editores de texto regulares também não chama apenas write() para o arquivo existente, mas em vez disso eles gravam em um novo arquivo e rename() o arquivo de troca para substituir o arquivo antigo. Mesmo quando você tem um editor de texto que suporte a escrita no local, eles normalmente tentam truncar o arquivo primeiro, o que obviamente não é suportado em um dispositivo de caractere especial.

    
por 09.04.2017 / 08:08
2

In 1970's, we had hardware terminals CUI.

No entanto, ninguém usou o termo CUI nos anos 70.

Now in my Linux box, I see seven terminal emulators, where GUI is occupying 7th terminal emulator(Ctrl+Alt+F7).

Estes emuladores de terminal já estavam disponíveis nos anos 80, e não havia GUI.

Using some editor, Is this terminal file /dev/tty0 accessible in user space?

Esta questão não faz sentido. Todos os arquivos são acessíveis no espaço do usuário por design, esse é o ponto inteiro dos arquivos, especialmente aqueles em /dev . /dev/tty0 sendo um dispositivo, não pode ser editado, pois seu "conteúdo" é essencialmente efêmero. O que você lê é o que você digita no console e o que você escreve nele é exibido na tela.

    
por 09.04.2017 / 23:16
1

Sim, você certamente pode acessar qualquer TTY como um arquivo como qualquer dispositivo no unix. Eu marcaria essa questão como potencialmente duplicada, já que essa resposta faz um bom trabalho ao explicar como fazer o que você está perguntando uma situação semelhante.

Para resumir o que essa resposta diz, você pode interagir com outros TTYs usando echo e cat como faria em qualquer outro arquivo. A razão pela qual você não viu nada ao abrir o arquivo é porque, como muitos arquivos especiais, apenas novos dados estão disponíveis.

    
por 09.04.2017 / 01:22