convertir les jiffies en secondes

J’ai un morceau de code de l’espace utilisateur qui parsing / proc / PID / task / TID / stat pour obtenir l’utilisation du processeur. Je peux utiliser HZ pour obtenir les jiffies par seconde, mais ce code peut être déplacé vers une autre machine ayant une valeur configurée différente. Existe-t-il un moyen d’obtenir la valeur de HZ à partir de l’espace utilisateur à l’exécution?

Vous le divisez par le numéro que vous obtenez de sysconf (_SC_CLK_TCK).

Cependant, je pense que cela est probablement toujours 100 sous Linux, indépendamment du tic-tac de l’horloge, il est toujours présenté à l’espace utilisateur comme 100.

Voir man proc (5).

Pour clarifier les mathématiques derrière la réponse de MarkR :

sysconf(_SC_CLK_TCK) vous jiffies per second . Divisez les jiffies par le nombre obtenu à partir de sysconf(_SC_CLK_TCK) pour obtenir le nombre total de secondes.

  jiffies jiffies seconds -------------------- = ----------------- = ------- = seconds sysconf(_SC_CLK_TCK) (jiffies/second) 1 

La source de la commande “ps” inclut le fichier pour obtenir la valeur de HZ.

Ils recherchent également une “note ELF” avec le numéro 17 pour trouver la valeur de HZ (sysinfo.c):

  //extern char** environ; /* for ELF executables, notes are pushed before environment and args */ static unsigned long find_elf_note(unsigned long findme){ unsigned long *ep = (unsigned long *)environ; while(*ep++); while(*ep){ if(ep[0]==findme) return ep[1]; ep+=2; } return NOTE_NOT_FOUND; } [...] hz = find_elf_note(17); 

Je dois admettre que cela me semble étrange puisque les notes ELF sont une section définie lors de la compilation.

Pour les scripts shell, etc., utilisez getconf CLK_TCK partir de la ligne de commande. Utilisez cette option pour transmettre ce paramètre en tant que variable d’environnement ou sur la ligne de commande.

 main(int argc, char **argv) { unsigned long clk_tck = atol( getenv("CLK_TCK") || "0" ) || sysconf(_SC_CLK_TCK) ; ... /* your code */ 

Cela utilise le sysconf comme ci-dessus, mais vous permet de le remplacer par une variable d’environnement, qui peut être définie avec la commande ci-dessus.