CTRL + D não tem sentido aqui - é apenas outro byte. Isso ocorre porque seu terminal serial não está configurado para lidar com isso. Especificamente, você está efetivamente em modo bruto , ou Modo de entrada não-canônico . Veja o sinal -icanon
na sua saída stty -a
? Isso aperta isso. Veja como o POSIX descreve um terminal que deve considerar um caractere EOF:
-
EOF
- Caractere especial na entrada, que é reconhecido se o sinalizador ICANON estiver definido. Quando recebidos, todos os bytes que estão aguardando serem lidos são imediatamente passados para o processo sem esperar por uma nova linha, e o EOF é descartado. Assim, se não houver bytes esperando (ou seja, o EOF ocorreu no início de uma linha) , uma contagem de bytes de zero deve ser retornada da
read()
, representando uma indicação de final de arquivo. Se ICANON estiver definido, o caractere EOF será descartado quando processado.
- Caractere especial na entrada, que é reconhecido se o sinalizador ICANON estiver definido. Quando recebidos, todos os bytes que estão aguardando serem lidos são imediatamente passados para o processo sem esperar por uma nova linha, e o EOF é descartado. Assim, se não houver bytes esperando (ou seja, o EOF ocorreu no início de uma linha) , uma contagem de bytes de zero deve ser retornada da
Mas você não está trabalhando com um terminal canônico - você está trabalhando com um terminal que enviará qualquer / todos os dados para qualquer leitor, se solicitado, desde que haja pelo menos um byte para ser pressionado. O terminal não armazena em buffer entrada por linha - e, portanto, não pode substituir o byte EOF por uma leitura vazia - em vez disso, ele simplesmente envia o byte, o que, para cat
, apenas incentiva a leitura.
-
Se ICANON for definido, o processamento canônico será habilitado. Isso habilita as funções de edição erase e kill e a montagem de caracteres de entrada em linhas delimitadas por NL , EOF e EOL , conforme descrito em Processamento de entrada do modo canônico .
-
Se ICANON não estiver definido, as solicitações de leitura serão atendidas diretamente a partir da fila de entrada. Uma leitura não será satisfeita até que pelo menos MIN bytes tenham sido recebidos ou que o valor de tempo limite TIME tenha expirado entre os bytes. O valor do tempo representa décimos de segundo. Consulte Processamento de entradas no modo não-canônico para obter mais detalhes.