O que exatamente é um único “átomo” em um fluxo padrão no Linux?

O que exatamente é um único “átomo” em um fluxo padrão no Linux?

Conceitualmente, um fluxo é uma sequência de “caracteres” ou “átomos”, ou seja, um fluxo binário é uma sequência de 0s e 1s. Mas nos fluxos padrão do Linux, se eu escrever um script bash que pede "ler", acho que ele trata uma única linha (terminando com "ENTER") como um "caractere", 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, presumo 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?

Responder1

Fundamentalmente, pipes/arquivos/soquetes ou o que quer que você tenha conectado stdin/stdout/stderr são fluxos(*) debytes. As chamadas de sistema relevantes são read()e write()e as descrições POSIX delas dizem:

A função write() tentará escrever nbytes do buffer apontado por buf para o arquivo

e

A função read() deve tentar ler nbyte bytes do arquivo associado ao descritor de arquivo aberto fildes

Também,POSIX define o byte como sendo exatamente igual a um octeto, ou seja, uma unidade de oito bits.

Portanto, um byte de oito bits é a menor unidade que você pode ler ou escrever por vez, portanto, um “átomo”, se preferir.

Mas o que as diversas concessionárias fazem é uma questão diferente. readpor padrão lê uma linha, mas a função da biblioteca também fgets(). Dependendo do shell, você pode solicitar readapenas a leitura de um número fixo de bytes, por exemplo, no Bash:

$ echo foo | ( read -n 1 a; echo "first: $a"; read -n 1 b; echo "second: $b" )
first: f
second: o

Embora observe que o Bash readobedece ao local e considera a contagem comopersonagens, que pode ser multibyte. Mas isso não nos impede de ler um indivíduobyteem vez de:

$ echo äöä | (read -n 1 a; echo "first: $a"; LC_ALL=C read -n 1 b; echo "second: $b" )
first: ä
second: �

(* Há tambémdatagramasoquetes, que ainda são granulares de byte, mas também mantêm limites entremensagens(de zero ou mais bytes) enviado no soquete. Você provavelmente poderia conectar um soquete de datagrama configurado corretamente em stdin/stdout/stderr, mas quase ninguém faz isso.)

informação relacionada