sysctl(/proc/sys) ファイルに改行文字を書き込むとどのような影響がありますか?

sysctl(/proc/sys) ファイルに改行文字を書き込むとどのような影響がありますか?

今日私はsysctlファイルに改行文字を明示的に書き込むコードを見つけました。 Moby/Docker リファレンスソースコード。私の最初の考えは、作成者が改行文字が重複しているにもかかわらず、シェルの動作を複製するために一生懸命働いたことです。

しかし、そのトピックに関する文書を探し始め、どちらも情報を見つけるのが難しいことを知りました。これまで私は何も見つけませんでした。


sysctlファイルに書き込むとき、/proc/sys/多くの値はASCIIで書かれた整数です。たとえば、何かをオンまたはオフにするには、ファイルに1テキストを書き込む必要があります。0

一般的に、U&L、ブログなどに関するアドバイスは、シェルで使用することです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改行なしの1バイト、1改行付きの2バイト)を知り、対応するバイトのみを処理します。

sysctl入場用途標準sysctl処理機能改行文字を明示的に処理します。文字列では入力を終了します。ベクトルでは項目を区切ります。(ほとんどの数値は最終的にベクトルとして扱われます。例えば /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実用的な事項いつも改行文字を書いてくださいしたがって、これがほとんどの場合、引き続き機能すると想定するのは安全です。

(確認していませんでした)みんなhandlerssysctlなので、改行に反対する特定のハンドラがあるかもしれません。 )

関連情報