Hoje encontrei algum código que está escrevendo um caractere de nova linha explicitamente em um arquivo sysctl. Veja o código fonte do moby/docker . Meu primeiro pensamento é que o autor copiou diligentemente o comportamento do shell em go, apesar da nova linha ser redundante.
Mas então comecei a procurar documentação sobre o assunto e achei muito difícil encontrar informações de qualquer maneira. Não consegui inventar nada até agora.
Ao escrever arquivos sysctl em /proc/sys/
muitos dos valores são inteiros escritos em ASCII. Por exemplo, para ativar ou desativar algo, você precisa escrever 1
ou 0
como texto em um arquivo.
Muitas vezes, o conselho aqui no U&L e em blogs etc. é fazer isso no shell usando echo
. Por exemplo, ativando o encaminhamento IPv4:
echo 1 > /proc/sys/net/ipv4/ip_forward
Mas este conselho faz algo sutilmente diferente de seu objetivo declarado. Ele não grava um único byte 0x31 no arquivo. Ele escreve dois: 0x31 0x0A também conhecido como 1\n
. Eu sempre assumi que a nova linha (0x0A) era simplesmente ignorada pelo kernel.
Escrever um caractere de nova linha em um arquivo sysctl (por exemplo /proc/sys/net/ipv4/ip_forward
, ) tem algum efeito? As referências são bem-vindas, mesmo que sejam links para o código-fonte.
Na maioria dos casos, não deve fazer nenhuma diferença, pelo menos no final de uma string de entrada. Em todos os casos, apenas os dados escritos são processados - o kernel sabe quanto tempo o buffer fornecido é (1 byte para
1
sem nova linha, 2 para1
com uma nova linha) e processará apenas essa quantidade de bytes.sysctl
entradas usando as funções de manipulação padrãosysctl
tratam explicitamente de novas linhas: em strings, elas terminam input , em vetores, elas separam entradas (a maioria dos valores numéricos acaba sendo tratada como vetores, por exemplo/proc/sys/net/ipv4/ip_forward
). Isso além de atingir o final da entrada do usuário, que sempre encerra o processamento.Portanto, todos os itens a seguir produzem o mesmo resultado:
Assim a resposta a
é sim: indica o fim de um valor. Essa indicação pode ou não agregar informações em relação ao final da entrada como um todo; que depende do contexto (especificamente, se o valor que está sendo escrito é um vetor ou não).
Saída de manipulação de código para
sysctl
, ou seja , produzir o texto que é lido quando algo lê de umasysctl
entrada, sempre adiciona uma nova linha final, como seria de esperar.O
sysctl
utilitário sempre grava uma nova linha , portanto, é seguro supor que, na maioria dos casos, isso continuará válido.(Eu não verifiquei todos os
sysctl
manipuladores, então pode haver alguns manipuladores específicos que se opõem a novas linhas.)