今天我遇到了一些将换行符显式写入 sysctl 文件的代码。参见莫比/码头工人源代码。我的第一个想法是,尽管换行符是多余的,但作者还是努力地将 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
没有换行符为 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) 文件有什么影响吗?
是 yes:表示一个值的结束。与整个输入的结尾相比,该指示可能会也可能不会添加信息;这取决于上下文(具体来说,写入的值是否是向量)。
代码处理输出为了sysctl
,IE生成从条目读取内容时读取的文本sysctl
,总是添加终止换行符,正如预期的那样。
实用性sysctl
总是写一个换行符,因此可以安全地假设在大多数情况下这将继续有效。
(我没查过全部处理程序sysctl
,因此可能有一些特定的处理程序反对换行符。)