lkml.org 
[lkml]   [2001]   [Jan]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectRe: 2.4.0-x features ?
From
Date
 "Albert D. Cahalan" <acahalan@cs.uml.edu> writes:

> > 1) top (procps-2.0.7) gives me the messages :
> > 'bad data in /proc/uptime'
> > 'bad data in /proc/loadavg'
> > cat /proc/uptime
> > 1435.30 904.74
> > cat /proc/loadavg
> > 0.01 0.21 0.29 1/17 19444
> > What is wrong ?

You probably have locale settings where the decimal point is a comma
so scanf on /proc/loadavg etc. doesn't work. The following patch
(submitted to RedHat ages ago) fixes that for me.

diff -u --recursive procps-2.0.7-orig/proc/sysinfo.c procps-2.0.7-hacked/proc/sysinfo.c
--- procps-2.0.7-orig/proc/sysinfo.c Mon Jul 10 20:36:13 2000
+++ procps-2.0.7-hacked/proc/sysinfo.c Wed Nov 29 23:11:41 2000
@@ -13,6 +13,8 @@
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
+#include <locale.h>
+#include <assert.h>

#include <unistd.h>
#include <fcntl.h>
@@ -62,12 +64,19 @@
/***********************************************************************/
int uptime(double *uptime_secs, double *idle_secs) {
double up=0, idle=0;
+ char*numeric=setlocale(LC_NUMERIC,0);
+ /* It is necessary to save and restore the numeric locale, because
+ if the locale we're in happens to use , instead of decimal point,
+ we can't sscanf the values in /proc/uptime */
+ setlocale(LC_NUMERIC,"C");

FILE_TO_BUF(UPTIME_FILE,uptime_fd);
if (sscanf(buf, "%lf %lf", &up, &idle) < 2) {
fprintf(stderr, "bad data in " UPTIME_FILE "\n");
return 0;
}
+ setlocale(LC_NUMERIC,numeric);
+
SET_IF_DESIRED(uptime_secs, up);
SET_IF_DESIRED(idle_secs, idle);
return up; /* assume never be zero seconds in practice */
@@ -171,12 +180,20 @@
/***********************************************************************/
int loadavg(double *av1, double *av5, double *av15) {
double avg_1=0, avg_5=0, avg_15=0;
+ /* It is necessary to save and restore the numeric locale, because
+ if the locale we're in happens to use , instead of decimal point,
+ we can't sscanf the values in /proc/loadavg */
+ char*numeric=setlocale(LC_NUMERIC,0);
+ setlocale(LC_NUMERIC,"C");

FILE_TO_BUF(LOADAVG_FILE,loadavg_fd);
if (sscanf(buf, "%lf %lf %lf", &avg_1, &avg_5, &avg_15) < 3) {
fprintf(stderr, "bad data in " LOADAVG_FILE "\n");
exit(1);
+
}
+ setlocale(LC_NUMERIC,numeric);
+
SET_IF_DESIRED(av1, avg_1);
SET_IF_DESIRED(av5, avg_5);
SET_IF_DESIRED(av15, avg_15);
[...]


--

http://www.penguinpowered.com/~vii
\
 
 \ /
  Last update: 2005-03-22 13:14    [W:0.061 / U:0.876 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site