#include <stdio.h>
#ifdef linux
# include <fcntl.h>
#else
# include <sys/param.h>
# if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__)
# include <rpcsvc/rstat.h>
# endif
# if defined(SVR4) || defined (SYSV)
# include <netdb.h>
# ifndef hpux
# include <sys/systeminfo.h>
# endif
# ifndef FSCALE
# define FSCALE (1 << 8)
# endif
char hostname[MAXHOSTNAMELEN];
struct statstime res;
# endif
#endif
#ifdef OSF1
# define TBL_LOADAVG 3
# define TBL_SYSINFO 12
/*
* TBL_LOADAVG data layout
*/
struct tbl_loadavg {
union {
long l[3];
double d[3];
} tl_avenrun;
int tl_lscale; /* 0 scale when floating point */
long tl_mach_factor[3];
};
/*
* TBL_SYSINFO data layout
*/
struct tbl_sysinfo {
long si_user; /* User time */
long si_nice; /* Nice time */
long si_sys; /* System time */
long si_idle; /* Idle time */
long si_hz;
long si_phz;
long si_boottime; /* Boot time in seconds */
long wait; /* Wait time */
#define usr si_user
#define sys si_sys
#define idle si_idle
};
#endif
void GetLoad(float *,float *,float *);
#ifdef linux
/* linux version */
void GetLoad(float *small,float *medium,float *large)
{
char buffer[100];
int fd, len;
fd = open("/proc/loadavg", O_RDONLY);
len = read(fd, buffer, sizeof(buffer)-1);
close(fd);
buffer[len] = '\0';
sscanf(buffer,"%f%f%f",small,medium,large);
/* pas de verif ... */
}
#endif
#if defined(SVR4) || defined (SYSV)
void GetLoad(float *small,float *medium,float *large)
{
/*
* originally written by Matthieu Herrb - Mon Oct 5 1992
* modified for optimization
*/
if (rstat(hostname, &res) != 0) {
perror("rstat");
*small = *medium = *large = 0.0;
return;
}
*small = (float)res.avenrun[0]/FSCALE;
*medium = (float)res.avenrun[1]/FSCALE;
*large = (float)res.avenrun[2]/FSCALE;
}
#endif
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
void GetLoad(float *small, float *medium, float *large)
{
static double loadavg[3];
/*
* Written by Geir Inge Jensen, Tue Dec 22 1997
*/
if (getloadavg(&loadavg, 3) < 0) {
perror("getloadavg");
*small = *medium = *large = 0.0;
return;
}
*small = (float)loadavg[0];
*medium = (float)loadavg[1];
*large = (float)loadavg[2];
}
#endif
#ifdef OSF1
void GetLoad(float *small,float *medium,float *large)
{
int i;
double avenrun[3] ;
struct tbl_loadavg labuf;
struct tbl_sysinfo sibuf;
/* get load averages */
if (table(TBL_LOADAVG,0,&labuf,1,sizeof(struct tbl_loadavg))<0) {
perror("TBL_LOADAVG");
*small = *medium = *large = 0.0;
return;
}
if (labuf.tl_lscale != 0) /* scaled */
for(i=0;i<3;i++)
avenrun[i] = (labuf.tl_avenrun.l[i]/(double)labuf.tl_lscale) ;
else /* not scaled */
for(i=0;i<3;i++)
avenrun[i] = labuf.tl_avenrun.d[i] ;
*small = (float)avenrun[0];
*medium = (float)avenrun[1];
*large = (float)avenrun[2];
}
#endif
syntax highlighted by Code2HTML, v. 0.9.1