linux 標準流中的單個“原子”到底是什麼?
從概念上講,流是“字元”或“原子”的序列,即二進制流是 0 和 1 的序列。但是在 Linux 標準流中,如果我編寫一個詢問“讀取”的 bash 腳本,那麼我認為它將單行(以“ENTER”結尾)視為“字元”,但我不確定。這向我表明單個“原子”是一個字元串,並且原子由 ENTER 分隔。另外,我假設對於其他程序,它們不會將字元串作為輸入,而是其他數據類型。
我在正確的軌道上嗎?標準流中的原子/字元是什麼?程序如何知道如何將文件分割成原子?
從根本上說,管道/文件/套接字或您連接的任何東西 stdin/stdout/stderr 都是bytes的流(*) 。相關的系統呼叫是
read()
andwrite()
,它們的 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
雖然請注意,Bash
read
遵守語言環境並將計數作為characters,這可能是多字節的。但這並不能阻止我們讀取單個字節:$ echo äöä | (read -n 1 a; echo "first: $a"; LC_ALL=C read -n 1 b; echo "second: $b" ) first: ä second: �
(* 還有數據報套接字,它們仍然是字節粒度的,但也保留在套接字中發送的消息(零個或多個字節)之間的邊界。您可能可以將正確設置的數據報套接字插入到 stdin/stdout/stderr,但幾乎沒有人這樣做過。)