Linux 標準流中的單一「原子」到底是什麼?

Linux 標準流中的單一「原子」到底是什麼?

從概念上講,流是“字符”或“原子”的序列,即二進位流是0和1的序列。但在Linux標準流中,如果我編寫一個要求“讀取”的bash腳本,那麼我認為它將單行(以“ENTER”結尾)視為“字符”,但我不確定。這對我來說意味著單個“原子”是一個字串,並且原子由 ENTER 分隔。另外,我假設對於其他程序,它們不採用字串作為輸入,而是採用其他資料類型。

我走在正確的軌道上嗎?標準流中的原子/字元是什麼以及程式如何知道如何將檔案分割成原子?

答案1

從根本上講,管道/文件/套接字或您連接的 stdin/stdout/stderr 的任何內容都是流(*)位元組。相關的系統呼叫是read()write(),它們的 POSIX 描述如下:

write() 函數應嘗試將 buf 指向的緩衝區中的 nbyte 位元組寫入檔案 [...]

read() 函數應嘗試從與開啟的檔案描述子、fildes、[...] 關聯的檔案讀取 nbyte 位元組。

也,POSIX 將位元組定義為完全等於八位元組,即八位為一個單位。

因此,八位元組是一次可以讀取或寫入的最小單位,如果您願意的話,也可以稱為“原子”。

但不同的公用事業公司做什麼是另一回事。read預設情況下讀取一行,但庫函數也是如此fgets()。根據 shell 的不同,您可能可以要求read只讀取固定數量的字節,例如在 Bash 中:

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

但請注意,Bashread遵循區域設定並將計數視為人物,可以是多位元組。但這並不妨礙我們閱讀個人位元組反而:

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

(*還有數據報套接字,仍然是位元組粒度的,但也保留了之間的邊界訊息(零個或多個位元組)在套接字中發送。您可能可以將正確設定的資料報套接字插入到 stdin/stdout/stderr,但幾乎沒有人這樣做過。

相關內容