将换行符写入 sysctl (/proc/sys) 文件有什么影响吗?

将换行符写入 sysctl (/proc/sys) 文件有什么影响吗?

今天我遇到了一些将换行符显式写入 sysctl 文件的代码。参见莫比/码头工人源代码。我的第一个想法是,尽管换行符是多余的,但作者还是努力地将 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没有换行符为 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:表示一个值的结束。与整个输入的结尾相比,该指示可能会也可能不会添加信息;这取决于上下文(具体来说,写入的值是否是向量)。

代码处理输出为了sysctlIE生成从条目读取内容时读取的文本sysctl,总是添加终止换行符,正如预期的那样。

实用性sysctl总是写一个换行符,因此可以安全地假设在大多数情况下这将继续有效。

(我没查过全部处理程序sysctl,因此可能有一些特定的处理程序反对换行符。)

相关内容