¿Qué es exactamente un único "átomo" en una secuencia estándar en Linux?

¿Qué es exactamente un único "átomo" en una secuencia estándar en Linux?

Conceptualmente, una secuencia es una secuencia de "caracteres" o "átomos", es decir, una secuencia binaria es una secuencia de 0 y 1. Pero en las secuencias estándar de Linux, si escribo un script bash que pregunta "leer", creo que trata una sola línea (que termina en "ENTER") como un "carácter", pero no estoy seguro. Esto me sugiere que un único "átomo" es una cadena y que los átomos están delimitados por ENTER. Además, supongo que para otros programas no toman cadenas como entrada, sino otros tipos de datos.

¿Estoy en el camino correcto? ¿Cuáles son los átomos/caracteres en una secuencia estándar y cómo sabe el programa cómo dividir un archivo en átomos?

Respuesta1

Básicamente, las tuberías/archivos/sockets o cualquier cosa que haya conectado stdin/stdout/stderr son flujos (*) debytes. Las llamadas al sistema relevantes son read()y write()y las descripciones POSIX de ellas dicen:

La función write() intentará escribir nbytes de bytes desde el buffer señalado por buf al archivo [...]

y

La función read() intentará leer nbyte bytes del archivo asociado con el descriptor de archivo abierto, fildes, [...]

También,POSIX define el byte como exactamente igual a un octeto, es decir, una unidad de ocho bits.

Entonces, un byte de ocho bits es la unidad más pequeña que puede leer o escribir a la vez, es decir, un "átomo", por así decirlo.

Pero lo que hacen las distintas empresas de servicios públicos es un asunto diferente. readpor defecto lee una línea, pero también lo hace la función de biblioteca fgets(). Dependiendo del shell, es posible que puedas solicitar readleer solo un número fijo de bytes, por ejemplo, en Bash:

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

Aunque tenga en cuenta que Bash readobedece a la configuración regional y toma el conteo comocaracteres, que podría ser de varios bytes. Pero eso no nos impide leer a un individuobyteen cambio:

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

(* También haydatagramasockets, que todavía son granulares de bytes, pero también mantienen límites entremensajes(de cero o más bytes) enviados en el socket. Probablemente podría conectar un socket de datagrama configurado correctamente a stdin/stdout/stderr, pero casi nadie hace eso).

información relacionada