[C] comment acceder au donner d'un processus

comment acceder au donner d'un processus [C] - C - Programmation

Marsh Posté le 10-02-2004 à 08:32:16    

Voila un tite question sympa :
 
sous windows / unix.
 
a la fin d'execution d'un programme, je souhaiterais savoir comment de temps il est passer sur le proc.  
le temps doit etre garder par le scheduleur donc, comment le recuperer.
 
(il ne s'agit pas d'avoir le timestamp du proc car il ne donne pas les informations recherches).
 
thanks,
 
Sylvain

Reply

Marsh Posté le 10-02-2004 à 08:32:16   

Reply

Marsh Posté le 10-02-2004 à 09:34:43    

sous unix: man times
sous windows: msdn GetProcessTimes

Reply

Marsh Posté le 10-02-2004 à 10:25:48    

Code :
  1. /**
  2. * Un ps tres rudimentaire
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <sys/types.h>
  9. #include <dirent.h>
  10. /**
  11. * Dertermine si une d est un repertoire relatif a un processus
  12. */
  13. static int is_procdir(const struct dirent *d)
  14. {
  15.   if(d==NULL || d->d_type!=DT_DIR)
  16.     {
  17.       return 0;
  18.     }
  19.   else
  20.     {
  21.       size_t i, len=strlen(d->d_name);
  22.      
  23.       for(i=0; i<len; ++i)
  24. {
  25.   if(!isdigit(d->d_name[i]))
  26.     {
  27.       return 0;
  28.     }
  29. }
  30.     }
  31.   return 1;
  32. }
  33. /**
  34. * Tri de dirent sur un critere de croissance numerique
  35. */
  36. static int reverse_numsort(const void *a, const void *b)
  37. {
  38.   long unsigned ai, bi;
  39.   if(sscanf((*(const struct dirent **)a)->d_name, "%lu", &ai) != 1
  40.      || sscanf((*(const struct dirent **)b)->d_name, "%lu", &bi) != 1)
  41.     {
  42.       return 0;
  43.     }
  44.   return bi - ai;
  45. }
  46. /**
  47. * Affiche les informations relatives a un processus selon /proc/<pid>/stat  
  48. */
  49. static void print_procinfo(const char *procdir)
  50. {
  51.   char fullpath[sizeof "/proc/" + NAME_MAX + 1 + sizeof "/stat"];
  52.   sprintf(fullpath, "/proc/%s/stat", procdir);
  53.   FILE *F=NULL;
  54.   if((F=fopen(fullpath, "r" )) == NULL)
  55.     {
  56.       perror("fopen" );
  57.       return;
  58.     }
  59.   pid_t pid;
  60.   char name[NAME_MAX + 1];
  61.   if(fscanf(F, "%d (%[^)]s)", &pid, name) == 2)
  62.     {
  63.       printf("pid=%-6d\tname=%s\n", pid, name);
  64.     }
  65.   else
  66.     {
  67.       printf("Erreur\n" );
  68.     }
  69.   fclose(F);
  70. }
  71. int main()
  72. {
  73.   struct dirent **namelist=NULL;
  74.   int n;
  75.  
  76.   n=scandir("/proc", &namelist, is_procdir, reverse_numsort);
  77.  
  78.   if(n < 0)
  79.     {   
  80.       perror("scandir" );
  81.     }
  82.   else
  83.     {
  84.       printf("--- %d processus ---\n", n);
  85.       while(n--)
  86. {
  87.   print_procinfo(namelist[n]->d_name);
  88.   free(namelist[n]);
  89. }
  90.       free(namelist);
  91.     }
  92.   return 0;
  93. }

Reply

Marsh Posté le 10-02-2004 à 10:32:26    

thanks :)
 
cependant je viens d'essayer..sous windows, ca pas l'air terrible.
 
je compare au TimeStamp counter (rdtsc)
et ca rien a voir!!! quand le timestamp counter trouve 250 nanosec, windows trouve des trucs hallucinants:  
100144   * 100 nanosecondes !
 
 
 
 

Reply

Marsh Posté le 10-02-2004 à 10:34:46    

je vois pas tellement le rapport?!  
 
mais je regarderais ca demain,
ciao
 

Code :
  1. {
  2. HANDLE hProcess = GetCurrentProcess();
  3. FILETIME  ftCreate, ftExit, ftKernel, ftUser;
  4. SYSTEMTIME stCreate, stExit, stKernel, stUser;
  5. GetProcessTimes (hProcess, &ftCreate, &ftExit, &ftKernel, &ftUser);
  6. printf("<br>UserMode  %d * 100 nanosec", ftUser.dwLowDateTime );
  7. printf("<br>KernelMode %d * 100 nanosec", ftKernel.dwLowDateTime );
  8. }


Message édité par slvn le 10-02-2004 à 10:35:30
Reply

Marsh Posté le 10-02-2004 à 21:25:09    

SoWhatIn22 >> est ce que tu connais bien la fonction GetProcessTimes ... niveau precision surtout car elle ne semble par tres coherente. :/

Reply

Marsh Posté le 11-02-2004 à 08:11:23    

nan, désolé.

Reply

Sujets relatifs:

Leave a Replay

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