diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2008-01-27 11:37:44 +0100 |
---|---|---|
committer | Tobias Klauser <tklauser@xenon.tklauser.home> | 2008-01-27 11:37:44 +0100 |
commit | 7e0f021a9aec35fd8e6725e87e3313b101d26f5e (patch) | |
tree | b1cacc4b24393f517aeb4610e9e1021f954307a8 /reference/C/CONTRIB/OR_USING_C/c.1.c |
Initial import (2.0.2-6)2.0.2-6
Diffstat (limited to 'reference/C/CONTRIB/OR_USING_C/c.1.c')
-rw-r--r-- | reference/C/CONTRIB/OR_USING_C/c.1.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/OR_USING_C/c.1.c b/reference/C/CONTRIB/OR_USING_C/c.1.c new file mode 100644 index 0000000..257f3c8 --- /dev/null +++ b/reference/C/CONTRIB/OR_USING_C/c.1.c @@ -0,0 +1,96 @@ +#include <sys/param.h> +#include <sys/time.h> +#include <sys/file.h> +#include <nlist.h> +#include <stdio.h> + +/* + * We declare an array of nlist structures, + * and initialize them to the names of the + * variables we want. The last entry is + * to terminate the list. + */ +struct nlist nl[] = { +#define X_BOOTTIME 0 + { "_boottime" }, +#define X_AVENRUN 1 + { "_avenrun" }, + { 0 } +}; + +main() +{ + int kmem; + char *ctime(); + struct timeval boottime; + + /* + * _avenrun is an array of three numbers. + * Most machines use floating point; Sun + * workstations use long integers. + */ +#ifdef sun + long avenrun[3]; +#else + double avenrun[3]; +#endif + + /* + * Open kernel memory. + */ + if ((kmem = open("/dev/kmem", O_RDONLY)) < 0) { + perror("/dev/kmem"); + exit(1); + } + + /* + * Read the kernel namelist. If nl[0].n_type is + * 0 after this, then the call to nlist() failed. + */ + if ((nlist("/vmunix", nl) < 0) || (nl[0].n_type == 0)) { + fprintf(stderr, "/vmunix: no namelist\n"); + exit(1); + } + + /* + * Read the _boottime variable. We do this by + * seeking through memory to the address found + * by nlist, and then reading. + */ + lseek(kmem, (long) nl[X_BOOTTIME].n_value, L_SET); + read(kmem, (char *) &boottime, sizeof(boottime)); + /* + * Read the load averages. + */ + lseek(kmem, (long) nl[X_AVENRUN].n_value, L_SET); + read(kmem, (char *) avenrun, sizeof(avenrun)); + + /* + * Now print the system boot time. + */ + printf("System booted at %s\n", ctime(&boottime.tv_sec)); + + /* + * Print the load averages. Sun workstations use + * FSCALE to convert the long integers to floating + * point. The three elements of _avenrun are the + * load average over the past one, five, and ten + * minutes. + */ +#ifdef sun + printf("One minute load average: %.2f\n", + (double) avenrun[0] / FSCALE); + printf("Five minute load average: %.2f\n", + (double) avenrun[1] / FSCALE); + printf("Ten minute load average: %.2f\n", + (double) avenrun[2] / FSCALE); +#else + printf("One minute load average: %.2f\n", avenrun[0]); + printf("Five minute load average: %.2f\n", avenrun[1]); + printf("Ten minute load average: %.2f\n", avenrun[2]); +#endif + + close(kmem); + exit(0); +} + |