Como obter informações de disco livre e ocupado em C no Linux

Obter informações de disco (espaço livre e ocupado) é uma das coisas mais comuns a todos os usuários de computadores e sistemas computacionais (smartphones e tablets, por exemplo). Porém, as vezes é necessário obter tais informações "programaticamente", ou seja, um programa pode precisar requisitar este tipo de informação ao Sistema Operacional. As finalidades desse tipo de informação são diversas, como por exemplo: por puro conhecimento do espaço livre e usado em disco (para exibição ao usuário), telemetria de informações de disco via Internet ou rede local, saber se algum determinado recurso pode ser instalado considerando o espaço livre em disco, etc.

 

Este artigo, no formato de dicas e truques, mostrará uma forma de se obter informações do disco (incluindo espaço livre e ocupado em disco) programaticamente em C, considerando como sistema operacional o Linux.

 

 

A API statvfs

 

A API statvfs tem como finalidade permitir que sejam obtidas diversas informações de disco livre e/ou ocupado. Nativamente presente no Linux, esta API pode ser utilizada em C.

 

Por se tratar de algo nativo, significa que um programa que faz uso dela pode ser compilado, em teoria, em qualquer distribuição Linux, algo muito valioso visando distribuição e uso em massa de um programa.

 

 

O uso da statvfs

 

O uso da statvfs é simples. Primeiramente, seu programa deve incluir o header file sys/statvfs.h, conforme mostrado abaixo:

 

E há apenas uma função a ser utilizada, a própria statvfs. O protótipo da função ststvfs está abaixo:

 

Onde os parâmetros significam:

  • const char *path: ponteiro para um array de char contendo o caminho/path do disco das quais serão obtidas as informações;
  • struct statvfs *buf: ponteiro para uma estrutura do tipo statvfs, a qual conterá todas as informações disponíveis pela API após a execução da função.

 

A estrutura statvfs possui em seus elementos todas as informações possíveis de serem obtidas com a API. Na figura 1 estão presentes as informações (nome dos elementos da estrutura) e o que significam. 

 

Figura 1 - Estrutura statvfs para obter informações de disco (espaço livre e ocupado).
Figura 1 - Estrutura statvfs para obter informações de disco (espaço livre e ocupado). (fonte: http://man7.org/linux/man-pages/man3/statvfs.3.html)

 

IMPORTANTE: os tipos fsblkcnt_t e fsfilcnt_t são equivalentes a unsigned long.

 

 

Código-fonte - exemplo

 

Abaixo segue um código-fonte que exemplifica o uso da statvfs:

 

Cole o código-fonte em um editor de sua escolha e salve o arquivo como InfoDiscos.c. Para fazer a compilação, nenhuma biblioteca em especial é necessária, portanto a copilação pode ser feita da seguinte maneira:

 

 

E a execução é feita conforme abaixo:

 

 

Indo além - Telemetria de uso de disco pela Internet

 

Uma coisa que fiz em um servidor de arquivos que montei na minha casa (saiba mais lendo este artigo) foi monitorar pela Internet a porcentagem de disco ocupada do servidor, assim como o espaço ocupado. Isso foi feito utilizando a própria statvfs e uma biblioteca de minha autoria chamada ThingSpeakC. Isso me permite, de qualquer lugar do mundo com conexão à Internet, saber estas informações do meu servidor, de modo que eu consiga tomar decisão de buscar por mais espaço ou não. Além disso, um histórico destas informações fica gravado no próprio ThingSpeak, permitindo saber inclusive quando e como as medições variaram.

 

Portanto, aplicações simples e úteis podem ser feitas da mesma forma, utilizando plataformas Cloud como o ThingSpeak ou similares. Se quiser um exemplo de projeto usando esta "arquitetura", veja aqui.

 

 

Saiba mais

 

Servidor de arquivos Nextcloud na Orange PI PC Plus H3

Software serial: Como fazer?

Enviando temperatura dos núcleos da Raspberry Pi 3 para o ThingSpeak em C

 

 

Referências

 

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Pedro Bertoleti
Sou engenheiro eletricista formado pela Faculdade de Engenharia de Guaratinguetá (FEG - UNESP) e trabalho com desenvolvimento de sistemas embarcados em São Paulo capital. Curioso e viciado em tecnologia, sempre busco me aprimorar na área de eletrônica e programação, em especial em desenvolvimento de firmware (área que mais gosto de trabalhar e estudar).Para mais informações, acesse minha página no Facebook:https://www.facebook.com/pbertoleti

Deixe um comentário

avatar
 
  Notificações  
Notificar