Linux標準ストリームでは、単一の「原子」は正確に何ですか?

Linux標準ストリームでは、単一の「原子」は正確に何ですか?

概念的には、ストリームは「文字」または「原子」のシーケンスです。つまり、バイナリストリームは0と1のシーケンスです。しかし、Linux標準ストリームで「読み取り」を要求するbashスクリプトを書くと(「ENTER」で終わる)、1行を「文字」として扱うと思いますが、わかりません。これが私に意味するのは、単一の「原子」が文字列であり、原子がENTERで区切られていることです。また、他のプログラムでは、文字列を入力として使用せず、他のデータ型を使用すると想定しています。

私は正しい道を行っていますか?標準ストリームの原子/文字とは何ですか?プログラムはファイルを原子に分割する方法をどのように知っていますか?

答え1

デフォルトでは、パイプ/ファイル/ソケット、または接続するすべてのstdin/stdout/stderrはストリームです(*)バイト。関連するシステム呼び出しはおよびであり、read()POSIXwrite()の説明は次のとおりです。

write() 関数は、buf が指すバッファの nbyte バイトをファイル [...] に書き込もうとします。

そして

read() 関数は、開かれたファイル記述子 fildes,[...] に関連付けられたファイルから nbyte バイトを読み取ろうとします。

返品、POSIX はバイトをオクテットとまったく同じに定義します。つまり、8ビットは1単位です。

したがって、オクテットは、一度に読み書きできる最小単位、つまり「原子」です。

しかし、様々な公益事業会社が行うことは別の問題です。readデフォルトでは1行を読みますが、ライブラリ関数も同じですfgets()。シェルによっては、readBashなどの固定数のバイトのみを読み込むように要求できます。

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

しかし、Bashはreadロケールを尊重し、数を次のように処理します。数値、マルチバイトにすることができます。しかし、これは私たちが個人的な本を読むのを妨げることはありません。バイト代わりに:

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

(*しかもデータグラムソケットはまだバイトごとに細分化されていますが、ソケット間の境界も維持します。情報(0バイト以上)がソケットを介して送信されました。適切に設定されたデータグラムソケットをstdin / stdout / stderrに挿入できますが、これを行う人はほとんどいません。 )

関連情報