Como posso mostrar o tamanho dos arquivos em / proc? não deve ser tamanho zero

da seguinte mensagem, sabemos que existem dois caracteres no arquivo / proc / sys / net / ipv4 / ip_forward, mas por que mostrei que este arquivo é de tamanho zero?

Eu sei que isso não é um arquivo no disco, mas um arquivo na memory, então há algum comando que eu possa ver o tamanho real dos arquivos em / proc?

root@OpenWrt:/proc/sys/net/ipv4# cat ip_forward | wc -c 2 root@OpenWrt:/proc/sys/net/ipv4# ls -l ip_forward -rw-r--r-- 1 root root 0 Sep 3 00:20 ip_forward root@OpenWrt:/proc/sys/net/ipv4# pwd /proc/sys/net/ipv4 

Esses não são realmente arquivos em disco (como você mencionou), mas eles também não são arquivos na memory – os nomes em / proc correspondem a chamadas para o kernel em execução no sistema operacional e o conteúdo é gerado em tempo real.

O sistema não sabe o tamanho dos arquivos sem gerá-los, mas se você ler o “arquivo” duas vezes, não há garantia de obter os mesmos dados porque o sistema pode ter mudado.

Você pode estar procurando pelo programa sysctl -a .

Coisas em / proc não são realmente arquivos. Na maioria dos casos, eles nem são arquivos na memory. Quando você acessa esses arquivos, o driver do sistema de arquivos proc executa uma chamada do sistema que obtém dados apropriados para o arquivo e, em seguida, formata-os para saída. Geralmente, esses dados dynamics são construídos rapidamente. Um exemplo disso é / proc / net / arp, que contém o atual cache ARP.

Obter o tamanho dessas coisas só pode ser feito formatando toda a saída, portanto, isso não é feito apenas ao listar o arquivo. Se você quiser os tamanhos, use wc -c como você fez.

O sistema de arquivos /proc/ é uma “ilusão” mantida pelo kernel, que não se incomoda em dar o tamanho de (mais) seus pseudo-arquivos (já que calcular esse tamanho “real” geralmente envolve a construção de todo o pseudo-arquivo textual). conteúdo), e espera que a maioria dos arquivos [pseudo-] textuais de /proc/ sejam lidos em seqüência do primeiro ao último byte (ou seja, até EOF), em blocos razoavelmente dimensionados (por exemplo, 1K). Veja proc (5) man page para detalhes.

Portanto, não há como obter o tamanho real (de algum arquivo como /proc/self/maps ou /proc/sys/net/ipv4/ip_forward ) em um único syscall (como stat (2) , porque ele daria um tamanho de 0, conforme relatado pelos comandos stat (1) ou ls (1) ). Uma maneira típica de ler esses arquivos de texto pode ser

 FILE* f = fopen("/proc/self/maps", "r"); // or some other textual /proc file, // eg /proc/sys/net/ipv4/ip_forward if (f) { do { // you could use readline instead of fgets char line[256]; memset (line, 0, sizeof(line)); if (NULL == fgets(line, sizeof(line), f)) break; // do something with line, for example: fputs(line, stdout); } while (!feof (f)); fclose (f); } 

Não é realmente um arquivo na memory, é uma interface entre o usuário e o kernel.