Como as informações do terminal (como o tamanho da janela) são enviadas para um programa Linux?

Como as informações do terminal (como o tamanho da janela) são enviadas para um programa Linux?

Tudo o que sei é que um processo tem o descritor de arquivo 0/1 definido como stdin/stdout por padrão. Mas como programas como o vi sabem o tamanho da janela, especialmente quando posso redimensionar a janela livremente no ambiente de área de trabalho? Não consigo pensar em como isso poderia ser enviado por meio de sinais, então acho que existem outros mecanismos?

Não sei nada sobre emulador de terminal, o que acho que pode estar relacionado à questão. Qualquer indicação será útil e apreciada.

Responder1

O tamanho de um terminal é mantido na estrutura interna do kernel e pode ser consultado TIOCGWINSZe definido por TIOCSWINSZioctls. Veja a ioctl_tty(2)página de manual para detalhes.

Cada vez que o tamanho da janela é definido TIOCSWINSZ(por exemplo, xtermquando a janela da GUI foi redimensionada), o kernel enviará um SIGWINCHsinal para ogrupo de processos em primeiro planodesse terminal.

Um programa como vicaptura esse sinal e atualiza sua ideia do tamanho da janela via TIOCGWINSZ.

O tamanho da janela geralmente é definido pelo programa que dirige o final mestre de um pseudo-tty (como xtermou sshd), mas qualquer processo capaz de abrir o tty (seja no modo somente leitura ou somente gravação) pode fazê-lo.

Uma interface de linha de comando para esses ioctls é feita por meio do sttyprograma. (por exemplo. stty cols 80 rows 40). Isso é útil com terminais seriais reais, que não possuem tamanho inerente e nenhuma maneira padrão de transmitir essas informações.


Embora ainda não padronizado[1], tudo isso não é específico do Linux e funciona de forma semelhante em outros sistemas como BSD ou Solaris. Uma diferença notável é que umfundoO processo que tenta alterar o tamanho do seu controle tty TIOCSWINSZreceberá um SIGTTOUsinal no BSD e no Solaris, mas não no Linux.

Em qualquer um desses sistemas, umfundoo processo NÃO receberá um SIGWINCHsinal, nem quando seu tty de controle for redimensionado, nem quando se tornar um processo em primeiro plano. Os programas em tela cheia assumem que estão sendo executados em primeiro plano ou parados, e também consultam o tamanho do terminal mediante um SIGCONTsinal (juntamente com outras operações tty, como mudar para a tela alternativa ou desligar o modo canônico).

Observe que um processo não precisa ter um identificador aberto para um tty para ser seu tty controlador, e pode ter um identificador aberto para um tty sem ser seu tty controlador.

Não há outra maneira de um processo ser notificado sobre alterações no tamanho do terminal além de estar no grupo de processos em primeiro plano do tty. Além disso, não há uma maneira geral de ser notificado sobreoutroalterações nos parâmetros do terminal: tcsetattr(3)não gerará nenhum sinal ou evento que possa ser select(2)ativado.

[1]Uma interface padrão está programada para ser incluída em uma versão futura do POSIX, com as funções tcgetwinsizee tcsetwinsize, facilmente implementáveis ​​como wrappers para ioctl(TIOC[SG]WINSZ). Veraquipara detalhes.

informação relacionada