Olá galera,
alguém tem ideia de como conseguir informações sobre o sistema como, por exemplo, memória ram disponível, processos em execução, número de processos em execução em um módulo de kernel (em linguagem C).
Se puderem informar alguma api (biblioteca “.h” de módulo de kernel) que retorne esses dados. Ou citar, também, chamadas de sistemas que façam essas tarefas.
Mais ou menos dessa maneira abaixo:
long int memoria_livre = get_memoria_livre( );
char *processos_atuais = get_processos_atuais( );
long int quantidade_processos = get_quantidade_processos( );
Agradeço desde já!
Não consegui encontrar as rotinas que preciso. Tem certeza que esse texto apresenta essas funções?
Tipo se eu registro um /proc/teste e quando der um “cat /proc/teste” imprima o que tem no “cat /proc/meminfo” e em outros proc, mas isso em linguagem C. Por exemplo:
[code]int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{
// imprime aqui informações relacionadas ao proc que eu registrei, no caso /proc/teste;
// recupera informações da memória;
char *str = executa(cat /proc/meminfo); /*armazenando em uma string, por exemplo*/
printk(KERN_ALERT "\nInformações Memória --> %s\n",str);
return ALGUMA_COISA;
}[/code]
/proc/meminfo pode ser considerado, para o programador, como um arquivo-texto.
Então a idéia é você ler esse arquivo e obter as informações adequadas.
Como é que você lê um arquivo em um módulo do kernel é que são elas (até porque estou supondo que, na hora que esse seu módulo estiver carregado, o módulo que gera o /proc/meminfo já esteja carregado). Como não sei programação do kernel, então não sei se as rotinas comuns da biblioteca-padrão do C (por exemplo, fgets) podem ser usadas.
Então ‘bezier’, aí que está o problema. Não dá para chamar as rotinas comuns da biblioteca padrão da linguagem C. Tentei usar o open, read, fopen, não dá =/.
Tá tenso o problema.
Bom, acho que precisamos consultar este site:
http://kernelnewbies.org/
Talvez tenha de acessar o sysfs em vez do procfs, mas isso é porque não sei chongas de programação de kernel do Linux.
Esse problema tá tenso =/
[quote=andrecosta90]Então ‘bezier’, aí que está o problema. Não dá para chamar as rotinas comuns da biblioteca padrão da linguagem C. Tentei usar o open, read, fopen, não dá =/.
Tá tenso o problema.[/quote]
dá sim andre.
Um exemplo em c++:
[code]unsigned long get_mem_total() {
std::string token;
std::ifstream file("/proc/meminfo");
while(file >> token) {
if(token == “MemTotal:”) {
unsigned long mem;
if(file >> mem) {
return mem;
} else {
return 0;
}
}
file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return 0;[/code]
}
se quiser algo mais simples use as funções da glibc. Procura na documentação:
http://www.gnu.org/s/hello/manual/libc/index.html
[code]
#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info);
struct sysinfo {
long uptime; /* Seconds since boot /
unsigned long loads[3]; / 1, 5, and 15 minute load averages /
unsigned long totalram; / Total usable main memory size /
unsigned long freeram; / Available memory size /
unsigned long sharedram; / Amount of shared memory /
unsigned long bufferram; / Memory used by buffers /
unsigned long totalswap; / Total swap space size /
unsigned long freeswap; / swap space still available /
unsigned short procs; / Number of current processes /
unsigned long totalhigh; / Total high memory size /
unsigned long freehigh; / Available high memory size /
unsigned int mem_unit; / Memory unit size in bytes /
char _f[20-2sizeof(long)-sizeof(int)]; /* Padding for libc5 */
};[/code]