O que acontece quando eu escrevo cat /proc/cpuinfo
. É um pipe nomeado (ou algo mais) para o sistema operacional que lê as informações da CPU em tempo real e gera esse texto toda vez que eu o chamo?
filesystems
kernel
proc
slm
fonte
fonte
Respostas:
Sempre que você lê um arquivo
/proc
, isso invoca algum código no kernel que calcula o texto a ser lido como o conteúdo do arquivo. O fato de o conteúdo ser gerado dinamicamente explica por que quase todos os arquivos têm seu tempo relatado como agora e seu tamanho relatado como 0 - aqui você deve ler 0 como "não sei". Diferentemente dos sistemas de arquivos comuns, o sistema de arquivos montado/proc
, chamado procfs , não carrega dados de um disco ou outra mídia de armazenamento (como FAT, ext2, zfs,…) ou através da rede (como NFS, Samba, ...) e não chama o código do usuário (ao contrário do FUSE ).O Procfs está presente na maioria das unidades não-BSD. Ele começou sua vida no Bell Labs da AT&T na 8ª edição do UNIX como uma maneira de relatar informações sobre processos (e
ps
muitas vezes é uma bonita impressora de informações lidas/proc
). A maioria das implementações do procfs tem um arquivo ou diretório chamado/proc/123
para relatar informações sobre o processo com o PID 123. O Linux estende o sistema de arquivos proc com muito mais entradas que relatam o estado do sistema, incluindo o seu exemplo/proc/cpuinfo
.No passado, o Linux
/proc
adquiria vários arquivos que forneciam informações sobre drivers, mas esse uso agora é preterido em favor/sys
e/proc
agora evolui lentamente. As entradas gostam/proc/bus
e/proc/fs/ext4
permanecem onde estão para compatibilidade com versões anteriores, mas são criadas interfaces semelhantes mais recentes/sys
. Nesta resposta, vou me concentrar no Linux.Seu primeiro e segundo pontos de entrada para a documentação sobre
/proc
Linux são:proc(5)
página do manual ;/proc
sistema de arquivos na documentação do kernel .Seu terceiro ponto de entrada, quando a documentação não cobre, está lendo a fonte . Você pode fazer o download da fonte em sua máquina, mas este é um programa enorme e o LXR , a referência cruzada do Linux, é uma grande ajuda. (Existem muitas variantes do LXR; a que está sendo executada
lxr.linux.no
é de longe a mais agradável, mas infelizmente o site geralmente está inativo.) É necessário um pouco de conhecimento de C, mas você não precisa ser um programador para rastrear um valor misterioso .A manipulação principal de
/proc
entradas está nofs/proc
diretório Qualquer driver pode registrar entradas/proc
(embora, como indicado acima, agora seja preterido em favor de/sys
), portanto, se você não encontrar o que está procurandofs/proc
, procure em qualquer outro lugar. Drivers chamam funções declaradas eminclude/linux/proc_fs.h
. As versões do kernel até 3.9 fornecem as funçõescreate_proc_entry
e alguns wrappers (especialmentecreate_proc_read_entry
), e as versões do kernel 3.10 e superior fornecem apenasproc_create
eproc_create_data
(e mais algumas).Tomando
/proc/cpuinfo
como exemplo, uma pesquisa por"cpuinfo"
leva-lo para a chamada paraproc_create("cpuinfo, …")
nosfs/proc/cpuinfo.c
. Você pode ver que o código é basicamente um código padrão: como a maioria dos arquivos/proc
despeja apenas alguns dados de texto, há funções auxiliares para fazer isso. Existe apenas umaseq_operations
estrutura, e a carne real está nacpuinfo_op
estrutura de dados, que depende da arquitetura, geralmente definida emarch/<architecture>/kernel/setup.c
(ou às vezes em um arquivo diferente). Tomando o x86 como exemplo, somos levados aarch/x86/kernel/cpu/proc.c
. Lá a função principal éshow_cpuinfo
, que imprime o conteúdo do arquivo desejado; o restante da infraestrutura existe para alimentar os dados com o processo de leitura na velocidade solicitada. Você pode ver os dados sendo reunidos em tempo real a partir de dados em várias variáveis no kernel, incluindo alguns números computados em tempo real, como a frequência da CPU .Uma grande parte
/proc
é das informações por processo no/proc/<PID>
. Estas entradas são registradas emfs/proc/base.c
, notgid_base_stuff
conjunto ; algumas funções registradas aqui são definidas em outros arquivos. Vejamos alguns exemplos de como essas entradas são geradas:cmdline
é gerado porproc_pid_cmdline
no mesmo arquivo. Ele localiza os dados no processo e os imprime.clear_refs
, diferentemente das entradas que vimos até agora, é gravável, mas não legível. Portanto, asproc_clear_refs_operations
estruturas definem umaclear_refs_write
função, mas nenhuma função de leitura.cwd
é um link simbólico (um pouco mágico), declarado porproc_cwd_link
, que consulta o diretório atual do processo e o retorna como o conteúdo do link.fd
é um subdiretório. As operações no próprio diretório são definidas naproc_fd_operations
estrutura de dados (elas são padrão, exceto pela função que enumera as entradasproc_readfd
, que enumera os arquivos abertos do processo) enquanto as operações nas entradas estão em `proc_fd_inode_operations .Outra área importante de
/proc
é/proc/sys
, que é uma interface direta parasysctl
. A leitura de uma entrada nesta hierarquia retorna o valor do valor sysctl correspondente e a gravação define o valor sysctl. Os pontos de entrada para sysctl estão emfs/proc/proc_sysctl.c
. Os Sysctls têm seu próprio sistema de registro comregister_sysctl
e amigos.fonte
Ao tentar obter informações sobre que tipo de mágica está acontecendo nos bastidores, é o seu melhor amigo
strace
. Aprender a operar esta ferramenta é uma das melhores coisas que você pode fazer para obter uma melhor apreciação do que mágica louca está acontecendo nos bastidores.A partir da saída acima, você pode ver que
/proc/cpuinfo
é apenas um arquivo comum ou, pelo menos, parece ser um. Então, vamos nos aprofundar.Mergulho mais profundo
# 1 - com sl ..Olhando para o próprio arquivo, parece ser "apenas um arquivo".
Mas dê uma olhada mais de perto. Temos nossa primeira dica de que é especial, observe que o tamanho do arquivo é 0 bytes.
# 2 - com estatísticas ..Se observarmos agora o arquivo
corrida # 1 corrida # 2stat
, podemos obter nossa próxima dica de que há algo de especial/proc/cpuinfo
.Observe os horários de acesso, modificação e alteração? Eles continuam mudando para cada acesso. É altamente incomum que todos os três mudem assim. A menos que os atributos de carimbo de data e hora de um arquivo sejam editados, normalmente permanecem os mesmos.
# 3 - com arquivo ..Ainda outra pista de que esse arquivo é tudo menos um arquivo regular:
Se houvesse alguma manifestação de um pipe nomeado, seria semelhante a um desses arquivos:
Se tocarmos em um
# 4 - com montagem ..emptyfile
,/proc/cpuinfo
parece mais um arquivo que um cachimbo:Portanto, neste momento, precisamos dar um passo atrás e diminuir um pouco o zoom. Estamos olhando para um arquivo em particular, mas talvez devêssemos olhar para o sistema de arquivos em que este arquivo reside. E para isso, podemos usar o
mount
comandoOK, então o tipo de sistema de arquivos é do tipo
proc
. Portanto,/proc
é um tipo de sistema de arquivos diferente. Essa é a nossa dica de que os arquivos abaixo/proc
são especiais. Eles não são apenas seus arquivos comuns. Então, vamos descobrir mais algumas informações sobre o que torna oproc
sistema de arquivos especial.Dando uma olhada na
mount
página de manual de:E se dermos uma olhada na
proc
página de manual de:Um pouco mais abaixo na mesma página de manual:
Na parte inferior da página do manual, há uma referência a um documento do kernel que você pode encontrar aqui, intitulado: THE / proc FILESYSTEM . Citando esse documento:
Conclusões
Então, o que aprendemos aqui? Bem, considerando que
/proc
é referido como um pseudo sistema de arquivos e também uma "interface para estruturas internas de dados", provavelmente é seguro assumir que os itens contidos nele não são arquivos reais, mas apenas manifestações feitas para se parecer com arquivos, mas na verdade não são.Termino com esta citação que, aparentemente, estava em uma versão anterior da
man 5 proc
de 2004, mas por qualquer motivo não está mais incluída. NOTA: Não sei por que foi removido, pois descreve muito bem o que/proc
é:Fonte: O pseudo sistema de arquivos proc
Referências
fonte
strace -o catcpuproc.txt cat /proc/cpuinfo
A resposta dada pelo @slm é muito abrangente, mas acho que uma explicação mais simples pode vir de uma mudança de perspectiva.
No uso diário, podemos pensar em arquivos como coisas físicas, ie. pedaços de dados armazenados em algum dispositivo. Isso torna arquivos como / proc / cpuinfo muito misteriosos e confusos. No entanto, tudo faz todo sentido se pensarmos nos arquivos como uma interface ; uma maneira de enviar e receber dados de algum programa.
Os programas que enviam e recebem dados dessa maneira são sistemas de arquivos ou drivers (dependendo de como você define esses termos, pode ser uma definição muito ampla ou muito restrita). O ponto importante é que alguns desses programas usam um dispositivo de hardware para armazenar e recuperar os dados enviados por essa interface; mas nem todos.
Alguns exemplos de sistemas de arquivos que não usam um dispositivo de armazenamento (pelo menos diretamente) são:
O sistema operacional Plan9 ( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs ) é um exemplo extremo do uso de arquivos como uma interface de programação geral.
fonte