Dando caractere EOF a partir da linha de comando

2

Estou lendo o caractere do prompt de comando e verificando o EOF para o encerramento do programa.
Mas quando eu estou dando o comando Ctrl + D ele não está tomando como um EOF. Por favor, especifique o que fazer para isso.

Ctrl + C está funcionando, o que encerra todo o processo.

    
por Rahul 20.10.2015 / 09:16

2 respostas

2

Supondo que o modo tty "cozido", ctrl - D funciona encerrando o processamento de entrada de linha e enviando os dados já inseridos para o aplicativo. Então, se você digitar "abc" seguido por ctrl - D , esses três bytes serão enviados para o aplicativo.

Agora, como um aplicativo geralmente determina o fim do arquivo? EOF é assumido quando uma leitura retorna 0 bytes. Então você precisa fazer com que uma leitura retorne 0 bytes. Se você apertar primeiro enter e depois ctrl - D , a primeira coisa que você digitou é enviada para o aplicativo junto com o caractere de nova linha. Então o ctrl - D faz com que qualquer dado digitado (isto é, nada!) Seja enviado para o aplicativo, que lê 0 bytes, e assume EOF.

Se você digitar qualquer coisa após o entrar antes de pressionar ctrl - D , o aplicativo obterá essas teclas e aguardará por mais. Então, para gerar EOF sem primeiro pressionar enter , pressione ctrl - D duas vezes seguidas.

Então, para responder à sua pergunta: você primeiro digitou qualquer caractere (além da nova linha) antes de pressionar ctrl - D ? Se sim, tente duas vezes sucessivamente.

Isso pode ser testado com, por exemplo:

$ wc -l
test123     0     1     7

(pressione ctrl - D duas vezes depois do test123 .)

O utilitário wc mostra o número de linhas, palavras e caracteres lidos. As linhas são 0 porque você não inseriu uma nova linha e test123 é uma palavra e sete caracteres.

    
por 20.10.2015 / 15:13
1

Não há "caractere EOF", ctrl-D é traduzido pelo driver de terminal para a condição de final de arquivo , transmitido para quem está tentando ler passado (sem ele, um read(2) ou outra chamada esperada de entrada apenas esperará para sempre por mais entrada). Isso depende do modo em que o tty está, a discussão anterior se aplica ao modo cozido (o driver coleta linhas, permitindo uma forma limitada de edição de linha, linhas completas são enviadas ao leitor). O modo cozinhado é o padrão, usado pela maioria das leituras de programas do teclado. No modo raw (por exemplo, vi(1) ou outros editores configurados para obter o controle completo), o programa obtém cada caractere exatamente como digitado.

    
por 20.10.2015 / 20:58