Enviado em 09/09/2014 - 09:37h
Pessoal,cpu0 96804 9119 387122 6739554 62390 456399 64543 0 0 0
#include <iostream> #include <fstream> #include <cstring> #include <stdlib.h> #include <sstream> #include <fcntl.h> #include <stdint.h> //Variaveis FILE *fp; int line_num =1; int find_result =0; char buffer[8192]; int Pesquisa() { if((fp = fopen("/proc/stat","r")) != NULL) { while(fgets(buffer,8192,fp) != NULL) { if((strstr(buffer,"cpu"))!= NULL) { find_result++; } line_num++; } if(fp) fclose(fp); return find_result; } else{ return -1; } } void cpus_valores(int total) { int stat,useVmstatfile,cpu; std::string Testes; cpu = total -1; std::ostringstream ss; if((fp = fopen("/proc/stat","r")) != NULL) { for(int i = 0; i< cpu; i++) { ss << "cpu" << i; Testes = ss.str(); //Teste de Captura do Arquivo while(fgets(buffer,8192,fp) != NULL) { if((strstr(buffer,"Testes"))!= NULL) { } line_num++; } ss.str(""); } if(fp) fclose(fp); } } int main(int argc, char *argv[]) { int Total = 0; Total = Pesquisa(); std::cout<< Total << std::endl; cpus_valores(Total); return 0; }
Enviado em 09/09/2014 - 13:04h
cpu0 96804 9119 387122 6739554 62390 456399 64543 0 0 0
#include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <string> #include <map> #include <vector> using namespace std; // Largura das colunas na hora de imprimir os dados lidos. const unsigned col_width=11u; int main(){ // Vetor com os titulos das colunas. Os nomes das colunas são // passados para um construtor que utiliza a nova sintaxe do // C++11, que aceita uma lista de elementos. vector<string> col_names{ "CPU", "user", "nice", "system", "idle", "iowait", "irq", "softirq", "stolen", "guest", "guest_nice" }; // cpu_data faz o mapeamento entre o nome de uma CPU (string) e // uma lista de contadores (vetor de inteiros sem sinal). Eu // usei um vetor de valores sem nomes predefinidos porque cada // versão de kernel pode ter mais ou menos campos do que outras // versões (sendo que as primeiras quatro ou cinco colunas pa- // recem ter "sempre" existido). Mas como este programa monta // uma tabela, eu acabei usando o vetor col_names, definido acima, // com os nomes de colunas que vi numa manpage. map<string, vector<unsigned long long>> cpu_data; // Uma variável inteira sem sinal, que será usada no loop de // leitura dos sucessivos contadores associados a cada CPU. unsigned long long counter; // Um buffer para armazenar cada linha lida. string line; // Depois de ler cada linha, eu uso um "input string stream" // (istringstream, definido em <sstream>) para separar as colunas. istringstream line_parser; // Tente descobri qual informação a variável abaixo armazena. ;) string cpu_name; // Declara um stream de entrada para ler do arquivo, e já define // de que arquivo será feita a leitura. ifstream proc_stat("/proc/stat"); // Lê uma linha do arquivo de entrada. Se a leitura for bem sucedida, // entra no corpo do while. while(getline(proc_stat, line)){ // Limpa do objeto separador eventuais sinalizações de erro e/ou // fim de dados, que podem ter permanecido da iteração anterior do // loop. Em seguida, alimenta o separador com a linha que acabou // de ser lida, para que possamos separar suas partes. line_parser.clear(); line_parser.str(line); // A primeira coluna da linha é o nome da entidade cujos contadores // estarão nas colunas seguintes. Como só temos interesse nos con- // tadores de CPUs, só se entra no corpo do if se essa primeira co- // luna lida tiver realmente os três primeiros caracteres (i.e. a // substring começando na posição 0 e com 3 caracteres de compri- // mento) iguais ao texto "cpu". if((line_parser >> cpu_name) && cpu_name.substr(0, 3)=="cpu"){ // Existem dois tipo de linha com informações de CPU: as que são // relativas a cada core, que aparecem com a string "cpu" seguida // de um número, e a do total consolidado, que aparece apenas como // "cpu", sem sufixo. Para deixar mais claro, este programa troca // o rótulo da linha consolidada pela string "TOTAL", usando as // letras maiúsculas para dar ainda mais destaque à diferença. if(cpu_name=="cpu") cpu_name="TOTAL"; // Loop de leitura dos contadores. Cada contador é lido do sepa- // rador de colunas para a variável counter. Se a leitura for bem // sucedida, esse valor é colocado ao final do vetor de contadores // associados à CPU indicada por cpu_name. while(line_parser >> counter) cpu_data[cpu_name].push_back(counter); } } // Fecha o arquivo de onde os dados foram lidos. proc_stat.close(); // Imprime os dados lidos, começando com os títulos das colunas (lem- // brando que setw() é um manipulador que informa a largura usada para // o próximo dado a ser impresso)... for(auto &col : col_names) // itera sobre os nomes das colunas. cout << setw(col_width) << col; cout << '\n'; // ... e terminando com a impressão dos dados em si. for(auto &cpu_info : cpu_data){ // itera sobre os registros do mapa. // Primeiro imprime o nome da CPU (primeiro campo do registro, que // é usado no momento da leitura como chave de indexação do mapa)... cout << setw(col_width) << cpu_info.first; // ... e depois o valor de cada contador do vetor de contadores (o // vetor é o segundo campo do registro do mapa). for(auto &col : cpu_info.second) cout << setw(col_width) << col; // Fim dos dados desta CPU: pula a linha. cout << '\n'; } }
Enviado em 09/09/2014 - 14:15h
cpu0 96804 9119 387122 6739554 62390 456399 64543 0 0 0
#include <iostream> #include <fstream> #include <cstring> #include <stdlib.h> #include <sstream> #include <fcntl.h> #include <stdint.h> //Variaveis FILE *fp; int line_num =1; int find_result =0; char buffer[8192]; int Pesquisa() { if((fp = fopen("/proc/stat","r")) != NULL) { while(fgets(buffer,8192,fp) != NULL) { if((strstr(buffer,"cpu"))!= NULL) { find_result++; } line_num++; } if(fp) fclose(fp); return find_result; } else{ return -1; } } void cpus_valores(int total) { int stat,useVmstatfile,cpu; std::string Testes; cpu = total -1; std::ostringstream ss; if((fp = fopen("/proc/stat","r")) != NULL) { for(int i = 0; i< cpu; i++) { ss << "cpu" << i; Testes = ss.str(); //Teste de Captura do Arquivo while(fgets(buffer,8192,fp) != NULL) { if((strstr(buffer,"Testes"))!= NULL) { } line_num++; } ss.str(""); } if(fp) fclose(fp); } } int main(int argc, char *argv[]) { int Total = 0; Total = Pesquisa(); std::cout<< Total << std::endl; cpus_valores(Total); return 0; }
$ cat /proc/stat | grep cpu0 | sed -e "s/\ /\n/g"
$ cat /proc/stat | grep cpu0 | sed -e "s/\ /\n/g" >> dados.txt $ paste -d"=" variaveis.txt dados.txt >> source.txt
. source.txt
Enviado em 09/09/2014 - 14:32h
Caras agradeço pela ajuda, estou perto de resolver a parada, mas ainda preciso de uma ajuda, orientação a objeto ainda está me tirando umas noites de sono.void cpus_valores(int total) { std::ostringstream ss; std::string Nome_cpu; char buffe[255]; total = total-1; for(int i =0; i<=total;i++) { //Montando a string de pesquisa ss << "cpu" << i; Nome_cpu = ss.str(); FILE *arquivo = fopen("/proc/stat","r"); char buffe[255]; if(arquivo !=NULL) { while(fgets(buffe,255,arquivo)) { if((strstr(buffe,Nome_cpu.c_str()))!=NULL) { Valores *cpu = new Valores(); std::sscanf(buffe, "%s %s %s %s %s",cpu->cuse.c_str(),cpu->cice.c_str(),cpu->csys.c_str(),cpu->cide.c_str(),cpu->cwio.c_str()); std::cout << i <<":" << cpu->cuse.c_str()<< " " << cpu->cice.c_str()<< " " << cpu->csys.c_str()<< " " << cpu->cide.c_str()<< " " << cpu->cwio.c_str()<< " " << std::endl; } } fclose(arquivo); } else std::cout<<"falha a abrir arquivo" << std::endl; ss.str(""); } }
0:67176 67176 67176 67176 67176 1:67175 67175 67175 67175 67175 2:67174 67174 67174 67174 67174 3:67173 67173 67173 67173 67173
49998 51 45304 67176 24479 49997 50 45303 67175 24478 49996 49 45302 67174 24477 49995 48 45301 67173 24466
Enviado em 09/09/2014 - 14:44h
std::string::c_str() lhe devolve uma referência ao conteúdo do objeto std::string que não deve ser usada para fazer modificações nesse objeto. Você nem mesmo tem garantias de que se trata do próprio objeto, e não somente de uma cópia. Note, inclusive, que o ponteiro devolvido pela função é designado como const char *. Ao usá-lo como argumento de sscanf(), você tacitamente descarta o const.Enviado em 09/09/2014 - 15:21h
paulo1205Enviado em 09/09/2014 - 17:54h
Acabei de confirmar o preceito de que comentar demais é uma boa maneira de transformar um programa elegante e de poucas linhas num monstro. ;) De todo modo, editei minha primeira postagem com esses comentários. Espero que lhe sejam úteis.Enviado em 09/09/2014 - 18:21h
Pelo que me pareceu, o seu programa deveria ser muito parecido com o meu, com a diferença de que em lugar de ler para um vetor de contadores genéricos, você quer ler algumas das colunas para uma estrutura com campos que têm nomes bem conhecidos.map<string, vector<unsigned long long>> cpu_data; /* ... */ if((line_parser >> cpu_name) && cpu_name.substr(0, 3)=="cpu"){ while(line_parser >> counter) cpu_data[cpu_name].push_back(counter); }
struct exemplo { unsigned long long user, system, idle, iowait; // Nomes de exemplo!!! }; map<string, exemplo> cpu_data; /* ... */ if((line_parser >> cpu_name) && cpu_name.substr(0, 3)=="cpu"){ // Note que é uma linha de código só, que eu quebrei para ficar mais legível. line_parser >> cpu_data[cpu_name].user >> cpu_data[cpu_name].system >> cpu_data[cpu_name].idle >> cpu_data[cpu_name].iowait ; }
Instalação e configuração do Chrony
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Criando uma Infraestrutura para uma micro Empresa
O Que Fazer Após Instalar Ubuntu 25.04
O Que Fazer Após Instalar Fedora 42
Debian 12 -- Errata - Correções de segurança
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
modo de emergencia no linux [RESOLVIDO] (1)
Como criar um arquivo ISO de um sistema personalizado (3)