Pergunta

Estou estudando para um exame e estou confuso a respeito de como canônica vs. entrada não-canônica / obras de saída no Unix (por exemplo, maldições). I entender que existe um tampão para os quais são aplicadas as disciplinas "linha" de entrada canónica. Isso significa que o buffer é ignorada para a entrada de não-canônico, ou ele simplesmente significa que há disciplinas de linha são aplicadas? Como é que este processo diferem para as operações de entrada e saída?

Nos programas maldições com quem trabalhei que demonstram entrada canônico, a entrada digitada por um usuário é inserido automaticamente, quer depois de um certo número de caracteres foram digitados ou uma certa quantidade de tempo passou. São qualquer uma destas coisas consideradas "disciplinas de linha" ou isso é algo totalmente diferente?

Foi útil?

Solução

Para a entrada canônica - pense shell; Na verdade, acho que uma boa edição de linha de comando Bourne shell, desde Bash e parentes têm antiquado. Você digita uma linha de entrada; se você cometer um erro, você usa o caráter do apagamento (o padrão é Backspace , geralmente, às vezes Excluir ) para apagar o caractere anterior. Se você fracassar completamente, você pode cancelar a linha inteira com o personagem linha kill (não completamente padronizados, muitas vezes Control-X ). Em alguns sistemas, você tem uma palavra a apagar com Control-W . Tudo isso é a entrada canônica. A linha inteira é recolhida e editada até o final da linha - Voltar - é pressionado. Então, toda a linha é disponibilizada para programas de espera. Dependendo das chamadas de sistema read() que estão pendentes, toda a linha estará disponível para ser lido (por um ou mais chamadas para read()).

Para a entrada de não-canônico - pense vi ou vim ou qualquer outra coisa - você pressiona um personagem, e é imediatamente disponíveis para o programa. Você não são realizadas até você acertar retorno. O sistema faz nenhuma edição dos personagens; eles são disponibilizados para o programa assim que eles são digitados. Cabe ao programa de interpretar as coisas de forma adequada. Agora, vim faz fazer uma série de coisas que parecem um pouco como entrada canônica. Por exemplo, backspace se move para trás, e na entrada de modo apaga o que estava lá. Mas isso é porque escolhe vim para torná-lo comportar-se assim.

Canonical e não-canônico de saída é um negócio muito menos grave. Existem alguns pedaços de diferença, relacionados a coisas como se eco de retorno de carro antes da linha de alimentação, e se fazer atrasos (não é necessário com a eletrônica; importante nos dias em que o dispositivo de saída pode ter sido um 110- baud teletipo). Ele também pode fazer coisas como dispositivos de saída maiúsculas e minúsculas punho - teletypes, novamente. letras minúsculas são emitidos em maiúsculas, e maiúsculas letras como barra invertida e bonés.

Ela costumava ser que se você digitou todas as letras maiúsculas para o login rápido, em seguida, o programa de login iria converter automaticamente para o modo em que todos os tampões eram de saída com uma barra invertida na frente de cada capital real. Eu suspeito que isso não é mais feito em terminais eletrônicos.


Em um comentário, TitaniumDecoy perguntou:

Assim, com entrada não-canônica, é o buffer de entrada ultrapassado completamente? Além disso, onde disciplinas linha entrar?

Com a entrada não-canónica, a memória intermédia de entrada continua a ser utilizada; Se não há um programa com uma chamada read() espera para a entrada do terminal, os caracteres são mantidos na memória intermédia de entrada. O que não acontece é qualquer edição do buffer de entrada.

disciplinas

Linha são coisas como o conjunto de manipulações que a edição entrada faz. Assim, um aspecto da disciplina linha é que o caráter do apagamento apaga um personagem antes no modo de entrada canônica. Se tiver icase (entrada caso de mapeamento) conjunto, então caracteres maiúsculas são mapeados para diminuir a caso, a menos que precedidos por uma barra invertida; que é uma disciplina linha, creio eu, ou um aspecto de uma disciplina de linha.


I esqueceu de mencionar que o processamento EOF ( Controlo-D ) é tratado no modo canónica; É realmente significa 'fazer a entrada acumulado disponível para read()'; se houver entrada de nenhum acumulada (se você digitar Control-D no início de uma linha), então o read() irá retornar zero bytes, que é então interpretado como EOF por programas. Claro, você pode alegremente digite mais caracteres no teclado depois disso, e programas que ignoram EOF (ou executados em modo não-canônica) vai ser muito feliz.

É claro que, no modo canônico, os caracteres digitados no teclado são normalmente exibida na tela; é possível controlar se that eco ocorre. No entanto, este é um tanto tangencial de entrada canónica; a edição normal ocorre mesmo quando echo está desativado.

sinais

Da mesma forma, a interrupção e parar são artefactos de processamento de modo canônico. Assim também são os sinais de controle do trabalho, tais como Control-Z para suspender o processo atual e retornar ao shell. Da mesma forma, o controlo de fluxo ( Controlo-S , Controlo-Q para parar e iniciar saída) é fornecido pelo modo canónica.

O capítulo 4 do programação Avançada Unix do Rochkind, 2a ed tampas de terminal I / O e dá muita desta informação - e muito mais. Outros UNIX livros de programação (pelo menos, os bons) também vai cobri-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top