[C][Gnu] info utilisation memoire, processeur et swap [résolu]

info utilisation memoire, processeur et swap [résolu] [C][Gnu] - C - Programmation

Marsh Posté le 08-11-2011 à 22:54:26    

Bonjour,
Je voudrais récupéré les info comme si je faisais un top ou un ps aux, sur le processus courant.
Dans un premier temps, je voudrais savoir comment connaître le processus courant.
Quel bibliothèque utiliser ?
Vous pouvez m'aider ?


Message édité par Profil supprimé le 09-11-2011 à 04:17:50
Reply

Marsh Posté le 08-11-2011 à 22:54:26   

Reply

Marsh Posté le 08-11-2011 à 22:56:34    

Pour connaître le processus courant tu as la fonction 'getpid' qui te renvoie le pid.
Après, ça dépend de ce que tu veux récupérer comme infos.

Reply

Marsh Posté le 08-11-2011 à 23:08:42    

Pouet_forever a écrit :

Pour connaître le processus courant tu as la fonction 'getpid' qui te renvoie le pid.
Après, ça dépend de ce que tu veux récupérer comme infos.


En fait, je me suis embrouiller en retombant sur terre.
Je voudrais connaître l'utilisation mémoire totale de la bécane, l'utilisation processeur total de la bécane, et la priorité du processus courant mais pas ce programme, c'est à dire que j'aimerais, je crois, tirer les info de l'ordonnanceur pour avoir le ou les (sur un multi) processus en cours.
 
Edit et le swap total.
 
edit Dans /proc/meminfo, j'ai le total et le free mémoire et le swap.
La mémoire, c'est réglé.


Message édité par Profil supprimé le 08-11-2011 à 23:40:12
Reply

Marsh Posté le 09-11-2011 à 01:37:30    

Bonsoir, j'ai un problème de pourcentage, j'espère que vous pourez m'aider,
 
Voici mon code dans le quel je calcul, mem_used, un float pour représenter le pourcentage d'utilisation mémoire avec mem_free et mem_total deux float pour représenter deux entier sous forme de chaîne de caractères.
Le problème, c'est qu'au lieu d'avoir dans les 30%, j'ai 77.32.
Si vous pouviez jeter un Oeil.

Code :
  1. /* Ce programme affiche les information de /proc/meminfo sur un L'afficheur LCD */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include "./libparalcd.h"
  7. #include <time.h>
  8. int main (void) {
  9.  
  10.   char date[9];
  11.   char hostname[9];
  12.  
  13.   char dummy[4096];
  14.  
  15.   char file[] = "/proc/meminfo";
  16.   FILE *fp;
  17.   char valeur[10];
  18.   char name[10];
  19.   char label_mem[] = "mem: \0";
  20.   char label_swap[] = "swap: \0";
  21.   char label_proc[] = "proc: \0";
  22.   char label_pid[] = "pid: \0";
  23.   char label_pri[] = "prio: \0";
  24.  
  25.   float mem_total, mem_free, mem_swap, mem_used = 0;
  26.  
  27.   char value_total[10];
  28.   char value_swap[10];
  29.   if (system(dummy)) return (1);
  30.  
  31.   fp = fopen(file, "r" );
  32.   if (!fp) {
  33.     perror("/proc/meminfo" );
  34.     return -1;
  35.   }
  36.    
  37.   time_t current_date = time(NULL);
  38.  
  39.   strftime(date, sizeof(date), "%H:%M:%S", localtime(&current_date));
  40.   gethostname(hostname, sizeof(hostname));
  41.  
  42.   if (ioperm(BASEPORT, 3, 1)) {
  43.     perror("can't set IO permissions!" );
  44.     return -1;
  45.   }
  46.  
  47.  
  48.   LCD_Init();   
  49.   usleep(120); 
  50.    
  51.   int i; 
  52.   for (i = 1; i <= 5 ; i++) {
  53.     fscanf(fp, "%s%s%s\n", name, valeur, dummy);   
  54.     current_date = time(NULL);
  55.    
  56.     switch (i) {
  57.      
  58.     case 1 : {
  59.      
  60.       char *p_conv = NULL;
  61.       mem_total = (float)strtol(valeur, &p_conv, 10);     
  62.       strftime(date, sizeof(date), "%H:%M:%S", localtime(&current_date));
  63.       LCD_ClearDisplay();       
  64.       usleep(120);
  65.       SetPosition_LCD(3, 1);     
  66.       usleep(120); 
  67.       LCD_WriteString(hostname);   
  68.       usleep(120);       
  69.       SetPosition_LCD(4, 1);     
  70.       usleep(120);
  71.       LCD_WriteString(date);
  72.       usleep(120);
  73.       SetPosition_LCD(1, 1);
  74.       LCD_WriteString(label_mem);   
  75.       usleep(120); 
  76.       sprintf(value_total, "%f", mem_total);
  77.       LCD_WriteString(value_total);   
  78.       usleep(120);
  79.       port_clear();
  80.       sleep(1);
  81.      
  82.       break;
  83.     }
  84.     case 2 : {
  85.       char *p_conv = NULL;
  86.       mem_free = (float)strtol(valeur, &p_conv, 10);
  87.       mem_used = ((mem_total-mem_free)/mem_total)*100;                       
  88.       strftime(date, sizeof(date), "%H:%M:%S", localtime(&current_date));
  89.       LCD_ClearDisplay();       
  90.       usleep(120);
  91.      
  92.      
  93.       SetPosition_LCD(3, 1);
  94.      
  95.       usleep(120); 
  96.       LCD_WriteString(hostname);   
  97.       usleep(120); 
  98.       SetPosition_LCD(4, 1);     
  99.       usleep(120);
  100.       LCD_WriteString(date);
  101.       usleep(120);
  102.       SetPosition_LCD(1, 1);
  103.       LCD_WriteString(label_mem);   
  104.       usleep(120); 
  105.       sprintf(value_total, "%f", mem_free);
  106.       LCD_WriteString(value_total);   
  107.       usleep(120);     
  108.       port_clear();
  109.       sleep(1);
  110.       break;
  111.     }
  112.     case 5 : {
  113.       char *p_conv = NULL;
  114.       mem_swap = (float)strtol(valeur, &p_conv, 10);     
  115.       strftime(date, sizeof(date), "%H:%M:%S", localtime(&current_date));
  116.       LCD_ClearDisplay();       
  117.       usleep(120);           
  118.       SetPosition_LCD(3, 1);
  119.       usleep(120); 
  120.       LCD_WriteString(hostname);   
  121.       usleep(120);
  122.       SetPosition_LCD(4, 1);     
  123.       usleep(120);
  124.       LCD_WriteString(date);
  125.       usleep(120);     
  126.       SetPosition_LCD(1, 1);
  127.       LCD_WriteString(label_mem);   
  128.       usleep(120); 
  129.       sprintf(value_total, "%f", mem_used);
  130.       LCD_WriteString(value_total);   
  131.       usleep(120); 
  132.       SetPosition_LCD(2, 1);
  133.       usleep(120); 
  134.       LCD_WriteString(label_swap);   
  135.       usleep(120);       
  136.       sprintf(value_swap, "%f", mem_swap);
  137.       LCD_WriteString(value_swap);     
  138.       port_clear();
  139.       sleep(1);
  140.      
  141.     }
  142.     }
  143.   }
  144.   fclose(fp);
  145.   port_clear();
  146.   if (ioperm(BASEPORT, 3, 0)) {
  147.     perror("can't reset IO permissions!" );
  148.     return -1;
  149.   }
  150.   return 0;
  151. }


Message édité par Profil supprimé le 09-11-2011 à 01:39:33
Reply

Marsh Posté le 09-11-2011 à 04:15:30    

J'ai résoiut tous mes problèmes pour le moment, en faisant un appel à ps.
 

Code :
  1. cpufp = popen("ps aux| awk 'NR > 0 { s +=$3 }; END {print s}'","r" );
  2.   fread(value_cpu, 1, sizeof(value_cpu)-1, cpufp);
  3.   fclose(cpufp);
  4.   memfp = popen("ps aux| awk 'NR > 0 { s +=$4 }; END {print s}'","r" );
  5.   fread(value_used, 1, sizeof(value_used)-1, memfp);
  6.   fclose(memfp);


 
Du coup je récupère la mémoire utiliser aussi comme ça.

Reply

Marsh Posté le 10-11-2011 à 22:19:28    

Du coup c'est vachement GNU :o

Reply

Marsh Posté le 11-11-2011 à 10:11:34    

Tamahome a écrit :

Du coup c'est vachement GNU :o


 
Bonjour, Si tu as une autre solution...
Pour la mémoire,  j'utilise /proc/meminfo en fait, parce que les opération ci-dessus me semblait un peu lourde.
 
Mais j'ai pas trouvé ou aller chercher les info pour l'utilisation cpu.

Reply

Marsh Posté le 15-11-2011 à 21:50:53    

J'ai pas dit que j'avais une autre solution, j'ai juste dit que le titre est foireux. C'est pas GNU, ni Posix (qui est pourtant gaulois) ton truc :o
 
Au mieux, écrit ça en assembleur, mais ça sera dépendant de ton proc.

Reply

Marsh Posté le 16-11-2011 à 08:28:16    

Tamahome a écrit :

J'ai pas dit que j'avais une autre solution, j'ai juste dit que le titre est foireux. C'est pas GNU, ni Posix (qui est pourtant gaulois) ton truc :o
 
Au mieux, écrit ça en assembleur, mais ça sera dépendant de ton proc.


 
Pourquoi c'est pas Gnu mon truc ?

Reply

Marsh Posté le 16-11-2011 à 15:37:10    

Si c'est pas Gnu, alors je peux demander comment faire la même chose sur MS Windows !  :o

Reply

Marsh Posté le 16-11-2011 à 15:37:10   

Reply

Marsh Posté le 16-11-2011 à 16:33:49    

C'est faisable, mais pas simple du tout.
Vas voir ce code par exemple: http://www.codeproject.com/KB/thre [...] Usage.aspx
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-11-2011 à 16:59:07    

gilou a écrit :

C'est faisable, mais pas simple du tout.
Vas voir ce code par exemple: http://www.codeproject.com/KB/thre [...] Usage.aspx
A+,


 
Merci Gilou, je vais le faire, mais avec Ada pour le moment.
 
Mais ça vas je crois que je vais y arriver.

Reply

Marsh Posté le 16-11-2011 à 17:07:19    

Arff j'en sais rien du langage à utiliser en fait... Avec Ada la fonction GetSystemTime n'est pas la même que celle présentée dans la documentation. Ou j'ai pas compris.
 
Comme je connais que très peu le langage C, j'hésite.  :??:


Message édité par Profil supprimé le 16-11-2011 à 17:08:00
Reply

Marsh Posté le 16-11-2011 à 21:29:09    

J'aurais besoin éventuellement d'un petit coup de pouce ici encore.
 
Je cherche comment appliquer une soustration soit des deux FILETIME soit de deus SYSTEMTIME.
 
J'ai fait ceci. Mais reste le problème des soustraction.
 

Code :
  1. #include <windows.h>
  2. #include <winbase.h>
  3. // Tu définis des types pointeurs sur les fonctions de la dll
  4. typedef BOOL (*LPFNDLLFUNC1)(LPFILETIME, LPFILETIME, LPFILETIME);
  5.  
  6. // tu définis en variables globales une variable par fonction de la dll avec le pointeur du bon type
  7. LPFNDLLFUNC1 lpfnGetSystemTimes;      // Function pointer to Out32
  8.  
  9.  
  10. // Dans le corps du main de ta fonction, tu fait la liaison avec la DLL
  11.  
  12. float GetCpuUsage (void) {
  13.  HINSTANCE hDLL;               // Handle to DLL
  14.  hDLL = LoadLibrary("kernel32" );  // Chargement dynamique de la DLL en mémoire
  15.  
  16.  if (hDLL != NULL) {
  17.  lpfnGetSystemTimes = (LPFNDLLFUNC1)GetProcAddress(hDLL, "GetSystemTime" );
  18.  if (!lpfnGetSystemTimes) {
  19.    // handle the error
  20.    FreeLibrary(hDLL);        
  21.    return -1;  // a toi de faire ce qu'il faut ici
  22.  }  
  23.  } else {
  24.    return 0;  // a toi de faire ce qu'il faut ici, avec un message comme quoi tu as pas pu charger la DLL
  25.  }
  26.  
  27.  
  28.  FILETIME last_userTime;
  29.  FILETIME last_kernelTime;
  30.  FILETIME last_idleTime;
  31.  BOOL res_alpha = lpfnGetSystemTimes( &last_idleTime, &last_kernelTime, &last_userTime );
  32.  
  33.  FILETIME idleTime;
  34.  FILETIME kernelTime;
  35.  FILETIME userTime;
  36.  BOOL res_beta = lpfnGetSystemTimes( &idleTime, &kernelTime, &userTime );
  37.    
  38.  SYSTEMTIME sys_last_userTime;
  39.  SYSTEMTIME sys_last_kernelTime;
  40.  SYSTEMTIME sys_last_idleTime;
  41.  SYSTEMTIME sys_userTime;
  42.  SYSTEMTIME sys_kernelTime;
  43.  SYSTEMTIME sys_idleTime;
  44.  FileTimeToSystemTime(&last_userTime, &sys_last_userTime);
  45.  FileTimeToSystemTime(&last_kernelTime, &sys_last_kernelTime);
  46.  FileTimeToSystemTime(&last_idleTime, &sys_last_idleTime);
  47.  int usr = sys_userTime - sys_last_userTime;
  48.  int ker = sys_kernelTime - sys_last_kernelTime;
  49.  int idl = sys_idleTime - sys_last_idleTime;
  50.  int sys = ker + usr;
  51.  
  52.  return (float)( (sys - idl) *100 / sys );
  53.  
  54. }


 
 
Si c'est possible,...  [:dawa_neowen]

Reply

Marsh Posté le 16-11-2011 à 22:52:35    

J'ai suivi Internet et je suis tombé sur une solution mais j'arrive pas à compiler un truc.

Code :
  1. #include <windows.h>
  2. #include <winbase.h>
  3.  
  4.  
  5. // Tu définis des types pointeurs sur les fonctions de la dll
  6. typedef BOOL (*LPFNDLLFUNC1)(LPFILETIME, LPFILETIME, LPFILETIME);
  7.  
  8. // tu définis en variables globales une variable par fonction de la dll avec le pointeur du bon type
  9. LPFNDLLFUNC1 lpfnGetSystemTimes;      // Function pointer to Out32
  10.  
  11.  
  12. // Dans le corps du main de ta fonction, tu fait la liaison avec la DLL
  13.  
  14. float GetCpuUsage (void) {
  15.  HINSTANCE hDLL;               // Handle to DLL
  16.  hDLL = LoadLibrary("kernel32" );  // Chargement dynamique de la DLL en mémoire
  17.  
  18.  if (hDLL != NULL) {
  19.  lpfnGetSystemTimes = (LPFNDLLFUNC1)GetProcAddress(hDLL, "GetSystemTime" );
  20.  if (!lpfnGetSystemTimes) {
  21.    // handle the error
  22.    FreeLibrary(hDLL);        
  23.    return -1;  // a toi de faire ce qu'il faut ici
  24.  }  
  25.  } else {
  26.    return ;  // a toi de faire ce qu'il faut ici, avec un message comme quoi tu as pas pu charger la DLL
  27.  }
  28.  
  29.  
  30.  FILETIME last_userTime;
  31.  FILETIME last_kernelTime;
  32.  FILETIME last_idleTime;
  33.  BOOL res_alpha = lpfnGetSystemTimes( &last_idleTime, &last_kernelTime, &last_userTime );
  34.  
  35.  FILETIME idleTime;
  36.  FILETIME kernelTime;
  37.  FILETIME userTime;
  38.  BOOL res_beta = lpfnGetSystemTimes( &idleTime, &kernelTime, &userTime );
  39.  
  40.  
  41.  
  42.  SYSTEMTIME sys_last_kernelTime;
  43.  SYSTEMTIME sys_last_idleTime;
  44.  SYSTEMTIME sys_last_userTime;
  45.  SYSTEMTIME sys_userTime;
  46.  SYSTEMTIME sys_kernelTime;
  47.  SYSTEMTIME sys_idleTime;
  48.  FileTimeToSystemTime(&last_userTime, &sys_last_userTime);
  49.  FileTimeToSystemTime(&last_kernelTime, &sys_last_kernelTime);
  50.  FileTimeToSystemTime(&last_idleTime, &sys_last_idleTime);
  51.  FileTimeToSystemTime(&userTime, &sys_userTime);
  52.  FileTimeToSystemTime(&kernelTime, &sys_kernelTime);
  53.  FileTimeToSystemTime(&idleTime, &sys_idleTime);
  54.  
  55.  typedef union timeunion {
  56.    FILETIME fileTime;
  57.  ULARGE_INTEGER ul;
  58.  } real_last_userTime, real_last_kernelTime, real_last_idleTime,
  59.      real_idleTime, real_kernelTime, real_userTime;
  60.  
  61.  
  62.  if (!SystemTImeToFileTime(&sys_last_userTime,&real_last_userTime))
  63.    return 1;
  64.  if (!SystemTImeToFileTime(&sys_last_kernelTime,&real_last_kernelTime))
  65.    return 2;
  66.  if (!SystemTImeToFileTime(&sys_last_idleTime,&real_last_idleTime))
  67.    return 3;
  68.  if (!SystemTImeToFileTime(&sys_userTime,&real_userTime))
  69.    return 4;
  70.  if (!SystemTImeToFileTime(&sys_kernelTime,&real_kernelTime))
  71.    return 5;
  72.  if (!SystemTImeToFileTime(&sys_idleTime,&real_idleTime))
  73.    return 6;
  74.  
  75.  
  76.  int usr = real_userTime.ul.QuadPart - real_last_userTime.ul.QuadPart;
  77.  int ker = real_kernelTime.ul.QuadPart - real_last_kernelTime.ul.QuadPart;
  78.  int idl = real_idleTime.ul.QuadPart - real_last_idleTime.ul.QuadPart;
  79.  int sys = ker + usr;
  80.  
  81.  return (float)( (sys - idl) *100 / sys );
  82.  
  83. }


 
 
J'obtien les erreur suivante à l'appel de SytemTimeToFileTime... Je sais pas pourquoi....

E:\LCDware>gcc -c -o monito.o monitor.c
monitor.c: In function 'GetCpuUsage':
monitor.c:62: error: expected expression before 'real_last_userTime'
monitor.c:64: error: expected expression before 'real_last_kernelTime'
monitor.c:66: error: expected expression before 'real_last_idleTime'
monitor.c:68: error: expected expression before 'real_userTime'
monitor.c:70: error: expected expression before 'real_kernelTime'
monitor.c:72: error: expected expression before 'real_idleTime'
monitor.c:76: error: expected expression before 'real_userTime'
monitor.c:77: error: expected expression before 'real_kernelTime'
monitor.c:78: error: expected expression before 'real_idleTime'


 
Edit : Ca y est, J'ai viré typedef et ça remarche. Merci de votre patience.  :jap:


Message édité par Profil supprimé le 16-11-2011 à 23:00:21
Reply

Marsh Posté le 16-11-2011 à 23:11:30    

C'est pas le I majuscule de SystemTImeToFileTime qui fait ça?
 
>> hDLL = LoadLibrary("kernel32" );  // Chargement dynamique de la DLL en mémoire
Inutile, le kernel est toujours en mémoire, on peut appeler directement la fonction.
 
Bref, tu peux faire
 
  FILETIME last_userTime;
  FILETIME last_kernelTime;
  FILETIME last_idleTime;
  BOOL res_alpha = GetSystemTimes( &last_idleTime, &last_kernelTime, &last_userTime );
   
  FILETIME idleTime;
  FILETIME kernelTime;
  FILETIME userTime;
  BOOL res_beta = GetSystemTimes( &idleTime, &kernelTime, &userTime );
 
et virer le code qui est avant
 
 
A+,


Message édité par gilou le 16-11-2011 à 23:14:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-11-2011 à 00:00:30    

Merci Gilou, Ca marche pas... pour une undefined reference to GetSystemTimes.
Si non ça marche. !  [:talen]

Reply

Marsh Posté le 17-11-2011 à 02:53:09    

Un probleme de flag préprocesseur ou de vieille version de windows.h
Recopies son prototype depuis winbase.h et ça devrait rouler.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-11-2011 à 14:17:26    

Bonjour Gilou !
 
Tu voudrais que je copie le contenu de winbase.h dans windows.h ?
Quel intérêt puisque j'inclue déjà les deux et ça marche pas ? :??:  

Reply

Marsh Posté le 17-11-2011 à 14:58:01    

Non, ce n'est pas ça.
Tu dois avoir le prototype de GetSystemTimes dans winbase.h, et pour une raison liée sans doute a des directives de preprocesseur, il n'est pas vu quand tu compiles le code, d'ou le "undefined reference to GetSystemTimes" je pense.
Donc en rajoutant le bon proto directement dans ton code, ça devrait coller.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-11-2011 à 15:13:45    

J'ai un message de Windows à l'exécution qui me dit que le procédure GetSystemTimes est introuvable dans le bibliothèque de liaison dynamique de kernel32.dll.
 
J'ai copier dans mon code le prototype de GetSystemTimes soit :

Code :
  1. WINBASEAPI BOOL WINAPI GetSystemTimes(LPFILETIME,LPFILETIME,LPFILETIME);

Message cité 1 fois
Message édité par Profil supprimé le 17-11-2011 à 15:22:50
Reply

Marsh Posté le 17-11-2011 à 16:29:46    

Euh, mais ça,ça ne se produit que si tu n'as pas au moins Windows XP SP2 d'installé!
Tu compiles sous quel version de Windows :heink:  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-11-2011 à 16:32:09    

XP SP1  :heink:  
 
Je vais installer SP2 pour voir, fallait le faire façon.

Reply

Marsh Posté le 17-11-2011 à 16:36:49    

Ah ben c'est pour ça que ça marche pas, c'est pas dans kernel32 avant le SP2.
Une fois en SP2, tu n'auras probablement plus besoin du proto ajouté.
 
Notes que j'ai trouvé un autre code, similaire, pour l'usage du CPU, ici: http://www.philosophicalgeek.com/2 [...] s-c-and-c/
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-11-2011 à 16:57:29    

gilou a écrit :

Ah ben c'est pour ça que ça marche pas, c'est pas dans kernel32 avant le SP2.
Une fois en SP2, tu n'auras probablement plus besoin du proto ajouté.


Ca marche avec le prototype de GetSystemTimes dans mon main file.

gilou a écrit :


Notes que j'ai trouvé un autre code, similaire, pour l'usage du CPU, ici: http://www.philosophicalgeek.com/2 [...] s-c-and-c/
 
A+,


Merci gilou.
J'ai jeté un coup d'oeil, mais c'est de C++, c'est plus plus tordu que du C.
Déjà que le C pour moi....  [:panzani gino]  
J'y rejeterais un coup d'oeil plus tard.
 
Déjà avec le SP2, j'ai pas le même résultat qu'en SP1.

Reply

Marsh Posté le 17-11-2011 à 17:27:05    

Et ça marche pas en fait, ma solution pour Windows.
Parfois j'ai une division par zéro, parfois j'ai -6.0, 6.0, ou encore 100.0, mais c'est pas bon.

Reply

Marsh Posté le 17-11-2011 à 17:55:19    

Avec un petit usleep(500000); entre les deux appel à GetSystemTimes, ça a l'air de donner un peu mieux.
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed