Linux

linux 標準流中的單個“原子”到底是什麼?

  • October 25, 2021

從概念上講,流是“字元”或“原子”的序列,即二進制流是 0 和 1 的序列。但是在 Linux 標準流中,如果我編寫一個詢問“讀取”的 bash 腳本,那麼我認為它將單行(以“ENTER”結尾)視為“字元”,但我不確定。這向我表明單個“原子”是一個字元串,並且原子由 ENTER 分隔。另外,我假設對於其他程序,它們不會將字元串作為輸入,而是其他數據類型。

我在正確的軌道上嗎?標準流中的原子/字元是什麼?程序如何知道如何將文件分割成原子?

從根本上說,管道/文件/套接字或您連接的任何東西 stdin/stdout/stderr 都是bytes的流(*) 。相關的系統呼叫是read()and write(),它們的 POSIX 描述說:

write() 函式應嘗試將 nbyte 字節從 buf 指向的緩衝區寫入文件

$$ … $$

read() 函式應嘗試從與打開的文件描述符 fildes 關聯的文件中讀取 nbyte 字節,

$$ … $$

此外,POSIX 將字節定義為完全等於 octet,即八位單元。

因此,一個八位字節是您一次可以讀取或寫入的最小單位,如果您願意的話,就是一個“原子”。

但是各種實用程序的作用是另一回事。read預設情況下讀取一行,但庫函式也是如此fgets()。根據外殼程序,您可能可以要求read只讀取固定數量的字節,例如在 Bash 中:

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

雖然請注意,Bashread遵守語言環境並將計數作為characters,這可能是多字節的。但這並不能阻止我們讀取單個字節

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

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

引用自:https://unix.stackexchange.com/questions/674714