Conceitualmente, um fluxo é uma seqüência de "caracteres" ou "átomos", ou seja, um fluxo binário é uma seqüência de 0s e 1s. Mas nos fluxos padrão do Linux, se eu escrever um script bash que pergunte "ler", acho que ele trata uma única linha (terminando com "ENTER") como um "caracter", mas não tenho certeza. Isso me sugere que um único "átomo" é uma string e que os átomos são delimitados por ENTER. Além disso, suponho que para outros programas, eles não aceitam strings como entrada, mas outros tipos de dados.
Estou no caminho certo? quais são os átomos/caracteres em um fluxo padrão e como o programa sabe como dividir um arquivo em átomos?
Fundamentalmente, pipes/files/sockets ou o que você conectou stdin/stdout/stderr são streams(*) de bytes . As chamadas de sistema relevantes são
read()
ewrite()
, e as descrições POSIX delas dizem:e
Além disso, POSIX define o byte como sendo exatamente igual a um octeto , ou seja, uma unidade de oito bits.
Então, um byte de oito bits é a menor unidade que você pode ler ou escrever de cada vez, então um "átomo", se você preferir.
Mas o que os vários utilitários fazem é uma questão diferente.
read
por padrão lê uma linha, mas a função de biblioteca tambémfgets()
. Dependendo do shell, você pode pedirread
para ler apenas um número fixo de bytes, por exemplo, no Bash:No entanto, observe que o Bash
read
obedece à localidade e usa a contagem como caracteres , que podem ser de vários bytes. Mas isso não nos impede de ler um byte individual :(* Existem também soquetes de datagrama , que ainda são granulares de byte, mas também mantêm limites entre mensagens (de zero ou mais bytes) enviadas no soquete. Você provavelmente poderia conectar um soquete de datagrama configurado corretamente a stdin/stdout/stderr, mas quase ninguém faz isso.)