Posso acessar o arquivo do terminal?

Posso acessar o arquivo do terminal?

Na década de 1970, tínhamos terminais de hardware CUI.

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

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

$ tty
/dev/tty0

Ao >catENTER no espaço do usuário, cato processo aguarda stdinpara receber a entrada do /dev/tty0arquivo. Não consegui visualizar /dev/tty0o arquivo usando nenhum editor.

Ambos stdine stdoutdo catprocesso estão trabalhando com /dev/tty0arquivo.

Pergunta:

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

Responder1

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

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

Os arquivos de terminal conectam duas entidades que desempenham funções 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 consegue lê-los (e normalmente os exibe ao usuário de alguma forma); quando o aplicativo lê dados, os dados vêm do terminal (normalmente são inseridos pelo usuário).

No seu caso, o aplicativo é sucessivamente o shell, o gato, o editor, etc. O editor pode tentar ler do terminal, mas se for o caso, está aguardando sua entrada e pode ou não reagir adequadamente ao final da entrada (que você sinalizaria pressionando Ctrl+D no início de uma linha). Mais uma vez, ler no terminal não lhe dará coisas que foramsaídapara o terminal.

No caso de um console, os dados gravados no terminal são desenhados na tela. Com consoles Linux, o texto exibido /dev/tty1pode ser lido no dispositivo/dev/vcs1enquanto permanecer exibível (para que você obtenha apenas o que é exibido na tela, mais o que ainda está disponível rolando para trás; qualquer coisa que não seja acessível rolando para trás será perdida para sempre).

Observe que este é um recurso oferecido 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 nenhum recurso semelhante.

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

Responder2

Sim, porém o arquivo do 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 normal teria um "-", 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".

É importante notar que em sistemas Unix como Linux, um sistema de arquivos é na verdade mais como um namespace para interações com objetos do 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 apoiados por 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 escrevendo fluxos de caracteres, eles são acessados ​​​​fazendoread()ewrite()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 tudo o que estava sendo digitado no console virtual usando um programa que usa o read()syscall como cat:

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

Ao contrário, eu também poderia 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. Mude para o emulador de console virtual com Ctrl+Alt+F1
  3. No emulador de console virtual, eu veria "olá mundo"

A maioria dos editores de texto regulares se recusará a abrir arquivos especiais não regulares porque são programados para verificar o tipo de arquivo e se recusarão a editar arquivos não regulares. Isso evita "acidentes" porque não faz muito 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()o arquivo existente, mas em vez disso grava em um novo arquivo e rename()no arquivo de troca para substituir o arquivo antigo. Mesmo quando você tem um editor de texto que suporta escrita no local, eles normalmente tentam truncar o arquivo primeiro, o que obviamente não é suportado em um dispositivo de caracteres especiais.

Responder3

Na década de 1970, tínhamos terminais de hardware CUI.

Porém, ninguém usava o termo CUI nos anos 70.

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

Esses emuladores de terminal já estavam disponíveis na década de 80 e não existia GUI.

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

Esta pergunta não faz sentido. Todos os arquivos são acessíveis no espaço do usuário por design, esse é o objetivo dos arquivos, especialmente aqueles em formato /dev. /dev/tty0sendo um dispositivo, não pode ser editado porque seu “conteúdo” é essencialmente efêmero. O que você lê é o que você eventualmente digita no console e o que você escreve nele é exibido na tela.

Responder4

Sim, você certamente pode acessar qualquer TTY como um arquivo, como qualquer dispositivo no Unix. Eu marcaria esta pergunta como potencialmente duplicada, poisesseresposta faz um bom trabalho explicando como fazer o que você está pedindo em uma situação semelhante.

Para resumir o que essa resposta diz, você pode interagir com outros TTYs usando echo e cat da mesma forma que 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.

informação relacionada