Was genau ist ein einzelnes „Atom“ in einem Standardstream in Linux?

Was genau ist ein einzelnes „Atom“ in einem Standardstream in Linux?

Konzeptionell ist ein Stream eine Folge von „Zeichen“ oder „Atomen“, d. h. ein binärer Stream ist eine Folge von Nullen und Einsen. Aber wenn ich in Linux-Standardstreams ein Bash-Skript schreibe, das „Lesen“ anfordert, dann behandelt es meiner Meinung nach eine einzelne Zeile (die mit „ENTER“ endet) als „Zeichen“, aber ich bin mir nicht sicher. Das lässt mich vermuten, dass ein einzelnes „Atom“ eine Zeichenfolge ist und dass Atome durch ENTER abgegrenzt werden. Außerdem gehe ich davon aus, dass andere Programme keine Zeichenfolgen, sondern andere Datentypen als Eingabe verwenden.

Bin ich auf dem richtigen Weg? Was sind die Atome/Zeichen in einem Standardstream und woher weiß das Programm, wie es eine Datei in Atome aufteilt?

Antwort1

Grundsätzlich sind Pipes/Dateien/Sockets oder was auch immer Sie mit stdin/stdout/stderr verbunden haben, Streams(*) vonBytes. Die relevanten Systemaufrufe sind read()und write(), und deren POSIX-Beschreibungen lauten:

Die Funktion write() soll versuchen, nbyte Bytes aus dem Puffer, auf den buf zeigt, in die Datei zu schreiben [...]

Und

Die Funktion read() soll versuchen, nbyte Bytes aus der Datei zu lesen, die mit dem geöffneten Dateideskriptor fildes verknüpft ist, [...]

Auch,POSIX definiert das Byte als genau gleich einem Oktett, also eine Einheit aus acht Bits.

Ein 8-Bit-Byte ist die kleinste Einheit, die Sie gleichzeitig lesen oder schreiben können, also sozusagen ein „Atom“.

Was die verschiedenen Dienstprogramme jedoch tun, ist eine andere Sache. readStandardmäßig wird eine Zeile gelesen, aber die Bibliotheksfunktion tut dies auch fgets(). Abhängig von der Shell können Sie möglicherweise readstattdessen das Lesen einer festen Anzahl von Bytes anfordern, z. B. in Bash:

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

Beachten Sie jedoch, dass Bash readdas Gebietsschema beachtet und die Anzahl alsFiguren, die mehrere Bytes umfassen können. Aber das hindert uns nicht daran, eine einzelneBytestattdessen:

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

(* Es gibt auchDatagrammSockets, die zwar immer noch bytegranular sind, aber auch Grenzen zwischenMitteilungen(von null oder mehr Bytes), die im Socket gesendet werden. Sie könnten wahrscheinlich einen richtig eingerichteten Datagramm-Socket an stdin/stdout/stderr anschließen, aber das macht kaum jemand.)

verwandte Informationen