O que acontece quando eu abro e leio de / proc? [duplicado]

14

O disco rígido precisa ser acessado ou tudo é feito na memória? Basicamente eu gostaria de constantemente obter valores atualizados de meminfo e cpuinfo.

Preciso reabrir o arquivo e, em seguida, reler para obter um valor atualizado ou posso apenas reler? Eu não tenho acesso a uma instalação do Linux no momento.

    
por flumpb 27.02.2011 / 05:21

5 respostas

14

Quando você lê /proc , o kernel gera conteúdo na hora. Não há disco rígido envolvido.

O que você está fazendo é semelhante ao que qualquer número de programas de monitoramento faz, então eu aconselho você a ver o que eles estão fazendo. Por exemplo, você pode ver o que o top faz:

strace top >/dev/null

O rastreamento mostra que o top abre /proc/uptime , /proc/loadavg , /proc/stat e /proc/meminfo de uma vez por todas. Para todos esses arquivos, exceto /proc/uptime , o top procura voltar ao início do arquivo (virtual) e lê novamente toda vez que ele atualiza sua exibição.

A maioria dos dados em /proc/cpuinfo é constante, mas alguns campos, como a velocidade da CPU em algumas máquinas, são atualizados dinamicamente.

O sistema de arquivos proc está documentado na documentação do kernel, em Documentation/filesystems/proc.txt . Se você ficar desesperado com alguns detalhes esotéricos, você pode navegar pela fonte .

    
por 27.02.2011 / 12:15
6

O sistema de arquivos / proc é o chamado "pseudo sistema de arquivos", o que significa que (afaiu) não há uso de disco.

Não sei bem como isso funciona no nível mais baixo, então posso estar errado, mas aqui vai. Se eu correr

f = open('/proc/meminfo')
f.read()
f.seek(0)
f.read()

Eu recebo duas saídas diferentes. Afaik, seek (0) apenas redefine o deslocamento de leitura e não reabre o arquivo. Isso sugere que reler um arquivo é suficiente para obter os novos valores.

Dito isto, se você está desenvolvendo para o Linux, ter acesso permanente ao Linux parece uma coisa bem lógica a se fazer ...

    
por 27.02.2011 / 07:38
4

Os arquivos não são armazenados no disco, mas são ganchos para o kernel.

Quando você abre um arquivo (usando fopen() ), o kernel manipula este trabalho. Ele percorre os pontos de montagem, encontra o driver apropriado para manipular a solicitação e entrega a tarefa a esse driver.

No caso de /proc , o pedido de leitura do arquivo é passado para o sistema interno "proc" no kernel. No momento em que você lê o arquivo, ele retorna o valor da memória.

Um padrão similar também acontece com os arquivos em /dev . O kernel vê você abrir um nó dev com uma certa ID de dispositivo e associa o fluxo IO a um driver específico que manipula a solicitação.

Basically I would like to constantly get updated values from meminfo and cpuinfo.

Você pode ler o sistema de arquivos proc para ler esses valores, ou ver se existem outros syscalls que você pode usar para isso. No entanto, será um mecanismo de pesquisa, portanto, sempre há uma certa carga de sistema envolvida.

    
por 28.02.2011 / 14:05
1

O sistema de arquivos Unix é uma hierarquia única, que o Linux representa com seu subsistema VFS. Você monta sistemas de arquivos em alguns nós da árvore, por exemplo, ao conectar uma chave usb. Quando você tenta ler um arquivo, o VFS verifica qual sistema de arquivos está montado aqui e encaminha a solicitação ao módulo apropriado. Alguns dos sistemas de arquivos são suportados pelo disco io, alguns representam as estruturas de dados do kernel (/ proc, / sys, debugfs, cgroups…), alguns são baseados em rede, alguns são baseados em memória (tmpfs), alguns são implementados em userland via FUSE e pode ser apoiado por coisas malucas como bancos de dados, VCSes, ssh, arquivos e assim por diante.

    
por 28.02.2011 / 00:01
1

O sistema de arquivos /proc é um pseudo sistema de arquivos. É uma maneira conveniente de transferir memória do espaço do usuário para o espaço do kernel e vice-versa.

Cada entrada (arquivo ou diretório) no diretório /proc é criada por uma parte do kernel. Cada entrada pode ser lida e / ou escrita. Eles podem ser abertos a partir do userspace como qualquer arquivo normal. As entradas são criadas aproximadamente da seguinte maneira (dentro de um módulo do kernel):

procentry1 = create_proc_entry(path);
procentry1->read = read_function1;
procentry->write = write_function1;

Então, você especifica aproximadamente o caminho a ser criado e as funções que devem ser chamadas em leitura / gravação (você precisa de um ou ambos). A função read retorna uma string (como uma chamada de leitura de arquivo), enquanto a função write pega uma string. As funções de leitura e gravação correspondentes são chamadas sempre que um programa tenta ler / gravar no caminho do arquivo proc correspondente.

    
por 28.02.2011 / 20:36