將換行符寫入 sysctl (/proc/sys) 文件是否有任何影響?
今天我遇到了一些將換行符顯式寫入 sysctl 文件的程式碼。請參閱 moby/docker原始碼。我的第一個想法是,儘管換行符是多餘的,但作者還是努力將 shell 的行為複製到 go 中。
但後來我開始尋找有關該主題的文件,發現無論哪種方式都很難找到資訊。到目前為止,我還沒有想出任何東西。
在編寫 sysctl 文件時,
/proc/sys/
許多值都是用 ASCII 編寫的整數。例如,要打開或關閉某些東西,您必須將文本寫入文件1
或0
將其作為文本寫入文件。通常,關於 U&L 和部落格等的建議是在 shell 中使用
echo
. 例如開啟 IPv4 轉發:echo 1 > /proc/sys/net/ipv4/ip_forward
但這個建議與其既定目標略有不同。它不會將單個字節 0x31 寫入文件。它寫入兩個: 0x31 0x0A 也稱為
1\n
. 我一直認為換行符(0x0A)只是被核心忽略了。將換行符寫入 sysctl 文件(例如
/proc/sys/net/ipv4/ip_forward
)是否有任何影響? 歡迎參考,即使它們是指向原始碼的連結。
在大多數情況下,這兩種方式都不應該有任何區別,至少在輸入字元串的末尾是這樣。在所有情況下,只處理寫入的數據——核心知道提供的緩衝區有多長(1 字節表示
1
沒有換行符,2 表示1
有換行符)並且只會處理那麼多字節。
sysctl
使用標準處理sysctl
函式的條目顯式處理換行符:在字元串中,它們終止 input,在向量中,它們分隔條目(大多數數值最終被作為向量處理,例如/proc/sys/net/ipv4/ip_forward
)。這是除了到達使用者輸入的末尾之外,它總是結束處理。所以以下都產生相同的結果:
$ echo 1 > /proc/sys/net/ipv4/ip_forward $ printf 1 > /proc/sys/net/ipv4/ip_forward $ printf '1\n0\n' > /proc/sys/net/ipv4/ip_forward
因此答案
將換行符寫入 sysctl (/proc/sys) 文件是否有任何影響?
是:它表示一個值的結束。與整個輸入的結尾相比,該指示可能會或可能不會添加資訊;這取決於上下文(具體而言,寫入的值是否為向量)。
的程式碼處理輸出,
sysctl
即在從條目中讀取某些內容時生成讀取的文本*,*sysctl
總是添加一個終止換行符,正如預期的那樣。該
sysctl
實用程序總是寫一個換行符,因此可以安全地假設在大多數情況下這將繼續有效。(我沒有檢查所有的
sysctl
處理程序,所以可能有一些特定的處理程序反對換行。)