Linux

將換行符寫入 sysctl (/proc/sys) 文件是否有任何影響?

  • April 7, 2022

今天我遇到了一些將換行符顯式寫入 sysctl 文件的程式碼。請參閱 moby/docker原始碼。我的第一個想法是,儘管換行符是多餘的,但作者還是努力將 shell 的行為複製到 go 中。

但後來我開始尋找有關該主題的文件,發現無論哪種方式都很難找到資訊。到目前為止,我還沒有想出任何東西。


在編寫 sysctl 文件時,/proc/sys/許多值都是用 ASCII 編寫的整數。例如,要打開或關閉某些東西,您必須將文本寫入文件10將其作為文本寫入文件。

通常,關於 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處理程序,所以可能有一些特定的處理程序反對換行。)

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