Como um tty no Linux obtém dados e passa para um programa. E como buscá-lo?

Oct 02 2020

Digamos que eu tenha um programa C que possui o seguinte loop.

while ((c = getchar()) != EOF) {
    ...
}

Este loop parece ler os caracteres um por um à medida que são digitados no tty. Mas então eu não deveria ser capaz de mudar os personagens uma vez que eles tenham sido inseridos, claramente, isso não acontece.
Isso deve significar que o tty deve manter algum buffer para manter os valores que recebeu e ainda não foi enviado para stdin. Uma vez em stdin, os caracteres são lidos um por um.

Isto está certo? Em caso afirmativo, como posso obter os chars neste buffer, sem que eles tenham que ir para stdin? Tentei usar ioctl com FIONREAD, mas não parece funcionar (o tamanho do buffer é sempre zero, embora haja caracteres no terminal), e como esses dados não estão em stdin, isso significa métodos que leem stdin não funcionaria (foram dadas como respostas a perguntas semelhantes)

Respostas

1 APJo Oct 02 2020 at 14:10

Resposta curta :

termios.h, um arquivo de cabeçalho padrão POSIX, permite que você coloque o tty no modo bruto, enquanto geralmente está no modo cozido .

É sugerida a leitura de sua documentação / páginas de manual.

Uma página da web que lida passo a passo com a configuração do modo raw termios.hestá vinculada aqui .

Explicação:

Por padrão, a E / S do terminal é armazenada em buffer de linha , ou seja, a entrada tem a garantia de ser liberada / enviada para seu programa assim que uma linha for encerrada.

Na saída, isso é feito por meio de \nou fflush(stdout);, enquanto na entrada isso é feito pelo usuário pressionar a [ENTER]tecla.

Colocar o terminal no modo bruto permite que assim que uma tecla seja pressionada, o sinal de entrada seja enviado para o seu programa, junto com muitos outros recursos padrão, como eco sendo desativado.

Isso é muito comumente feito para qualquer programa CLI ligeiramente complicado, especialmente coisas como vim, htop, etc.