Possivelmente, o dispositivo tty
esteja no modo canônico (aquele em que a disciplina de linha tty implementa um editor de linha simples), portanto, um caractere eof
( ^D
por padrão) recebido da outra extremidade causa read()
não devolva nada.
Isso seria o mesmo de quando você executa
od -vx --endian=big
em um terminal e digite Ctrl-D .
Outra explicação seria que o modo canônico está desativado, mas a configuração VMIN
termios está configurada como 0. Com VMIN = 0, um read()
no arquivo do dispositivo retorna o que estiver lá, pronto para ser lido, se houver qualquer linha reta ausente e nada de outra forma (significando fim de arquivo) (a menos que VTIME > 0, nesse caso, ele espera até VTIME deciseconds por pelo menos um byte).
Novamente, você pode tentar em um terminal com:
s=$(stty -g); stty -icanon min 0 time 0; od -vx --endian=big; stty "$s"
Verifique as configurações atuais com:
stty -a < /dev/ttyUSB0
Se esse /dev/ttyUSB0
for um dispositivo serial que deve ser usado apenas para transferir dados e não para ser usado como um terminal, você deve emitir um
stty raw -echo < /dev/ttyUSB0
Na verdade, isso desativa a maioria dos efeitos da disciplina de linha tty.
Veja Quais são as responsabilidades de cada componente Pseudo-Terminal (PTY) (software, lado mestre, lado escravo)? e as suas páginas termios(3)
e stty(1)
man para mais informações.