今天我遇到了一些将换行符显式写入 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
)。这是除了到达用户输入的末尾之外,它总是结束处理。所以以下都产生相同的结果:
因此答案
是:它表示一个值的结束。与整个输入的结尾相比,该指示可能会或可能不会添加信息;这取决于上下文(具体而言,写入的值是否为向量)。
的代码处理输出,
sysctl
即生成从条目中读取内容时读取的文本sysctl
,总是添加终止换行符,正如预期的那样。该
sysctl
实用程序总是写一个换行符,因此可以安全地假设在大多数情况下这将继续有效。(我没有检查所有的
sysctl
处理程序,所以可能有一些特定的处理程序反对换行。)