L’appel système sysinfo renvoie des valeurs moyennes de charge incorrectes sur linux

J’ai un programme C qui imprime certaines statistiques du système.

#include  #include  int main() { int days, hours, mins; struct sysinfo sys_info; if(sysinfo(&sys_info) != 0) perror("sysinfo"); // Uptime days = sys_info.uptime / 86400; hours = (sys_info.uptime / 3600) - (days * 24); mins = (sys_info.uptime / 60) - (days * 1440) - (hours * 60); printf("Uptime: %ddays, %dhours, %dminutes, %ldseconds\n", days, hours, mins, sys_info.uptime % 60); // Load Averages for 1,5 and 15 minutes printf("Load Avgs: 1min(%ld) 5min(%ld) 15min(%ld)\n", sys_info.loads[0], sys_info.loads[1], sys_info.loads[2]); printf("Total Ram: %lluk\tFree: %lluk\n", sys_info.totalram *(unsigned long long)sys_info.mem_unit / 1024, sys_info.freeram *(unsigned long long)sys_info.mem_unit/ 1024); // Number of processes currently running. printf("Number of processes: %d\n", sys_info.procs); return 0; } 

Mon problème est que les valeurs de charge moyennes sont différentes de / proc / loadavg

 ./a.out Uptime: 1days, 4hours, 1minutes, 16seconds Load Avgs: 1min(13248) 5min(14880) 15min(11840) Total Ram: 2052956k Free: 188104k Number of processes: 265 

Pourquoi? J’imprime 13248 mais “top” ou “cat / proc / loadavg” donne 0,24. Quel est le problème?

L’appel ne renvoie pas les “mauvaises” valeurs. Notez que le type est entier, il ne peut donc pas être destiné à renvoyer les nombres à virgule flottante imprimés par disponibilité.

Voir ce fil de discussion pour savoir comment interpréter les valeurs renvoyées et comment les convertir en flotteurs plus familiers.

À mon avis (avant de lire le lien), il s’agissait simplement de 65 535 (2 16 ), ce qui semble être ce qu’ils ont trouvé. Donc divisez par 65536.0, ou pour être plus propre (comme indiqué dans un commentaire), utilisez la constante SI_LOAD_SHIFT et divisez par (float)(1 << SI_LOAD_SHIFT) .