📄 system.c
字号:
} if ((v5=parse_meminfo ("Cached:", buffer))<0) { fd=-1; return -1; } *total=v1; *free=v2; *shared=v3; *buffered=v4; *cached=v5; return 0;}int Load (double *load1, double *load2, double *load3){ static int fd=-2; char buffer[16]; static double val1=0; static double val2=0; static double val3=0; static time_t now=0; *load1=val1; *load2=val2; *load3=val3; if (fd==-1) return -1; if (time(NULL)==now) return 0; time(&now); if (fd==-2) { fd=open("/proc/loadavg", O_RDONLY); if (fd==-1) { error ("open(/proc/loadavg) failed: %s", strerror(errno)); return -1; } debug ("open(/proc/loadavg)=%d", fd); } if (lseek(fd, 0L, SEEK_SET)!=0) { error("lseek(/proc/loadavg) failed: %s", strerror(errno)); fd=-1; return -1; } if (read (fd, &buffer, sizeof(buffer)-1)==-1) { error("read(/proc/loadavg) failed: %s", strerror(errno)); fd=-1; return -1; } if (sscanf(buffer, "%lf %lf %lf", &val1, &val2, &val3)!=3) { error ("parse(/proc/loadavg) failed: unknown format"); fd=-1; return -1; } *load1=val1; *load2=val2; *load3=val3; return 0;}int Busy (double *user, double *nice, double *system, double *idle){ static int fd=-2; char buffer[64], *p; unsigned long v1, v2, v3, v4; double d1, d2, d3, d4, d5; *user=0.0; *nice=0.0; *system=0.0; *idle=0.0; if (fd==-1) return -1; if (fd==-2) { fd=open("/proc/stat", O_RDONLY); if (fd==-1) { error ("open(proc/stat) failed: %s", strerror(errno)); return -1; } debug ("open (/proc/stat)=%d", fd); } if (lseek(fd, 0L, SEEK_SET)!=0) { error ("lseek(/proc/stat) failed: %s", strerror(errno)); fd=-1; return -1; } if (read (fd, &buffer, sizeof(buffer)-1)==-1) { error ("read(/proc/stat) failed: %s", strerror(errno)); fd=-1; return -1; } p=strstr(buffer, "cpu "); if (p==NULL) { error ("parse(/proc/stat) failed: no 'cpu' line"); fd=-1; return -1; } if (sscanf(p+4, " %lu %lu %lu %lu", &v1, &v2, &v3, &v4)!=4) { error ("parse(/proc/stat) failed: unknown 'cpu' format"); fd=-1; return -1; } d1=smooth("cpu_user", 500, v1); d2=smooth("cpu_nice", 500, v2); d3=smooth("cpu_sys", 500, v3); d4=smooth("cpu_idle", 500, v4); d5=d1+d2+d3+d4; if (d5!=0.0) { *user=(d1+d2)/d5; *nice=d2/d5; *system=d3/d5; *idle=d4/d5; } return 0;}int Disk (int *r, int *w){ char buffer[4096], *p; static int fd=-2; *r=0; *w=0; if (fd==-1) return -1; if (fd==-2) { fd = open("/proc/stat", O_RDONLY | O_NDELAY); if (fd==-1) { error ("open(/proc/stat) failed: %s", strerror(errno)); return -1; } debug ("open (/proc/stat)=%d", fd); } if (lseek(fd, 0L, SEEK_SET)!=0) { error ("lseek(/proc/stat) failed: %s", strerror(errno)); fd=-1; return -1; } if (read (fd, &buffer, sizeof(buffer)-1)==-1) { error ("read(/proc/stat) failed: %s", strerror(errno)); fd=-1; return -1; } p=strstr(buffer, "disk_io:"); if (p!=NULL) { unsigned long rsum=0, wsum=0; p+=8; while (*p==' ') p++; while (*p && *p!='\n') { int i, n; unsigned long dummy; unsigned long rblk, wblk; i=sscanf(p, "(%lu,%lu):(%lu,%lu,%lu,%lu,%lu)%n", &dummy, &dummy, &dummy, &dummy, &rblk, &dummy, &wblk, &n); if (n==0 || i!= 7) { i=sscanf(p, "(%lu,%lu):(%lu,%lu,%lu,%lu)%n", &dummy, &dummy, &dummy, &rblk, &dummy, &wblk, &n)+1; } if (n>0 && i==7) { rsum+=rblk; wsum+=wblk; p+=n; while (*p==' ') p++; } else { error ("parse(/proc/stat) failed: unknown 'disk_io' format"); fd=-1; return -1; } } // assume that we got the number of sectors, and a sector size of 512 bytes. // to get te number in kilobytes/sec, we calculate as follows: // kb=blocks*512/1024, which is blocks/2 *r=smooth ("disk_r", 500, rsum/2); *w=smooth ("disk_w", 500, wsum/2); } else { unsigned long r1, r2, r3, r4; unsigned long w1, w2, w3, w4; p=strstr(buffer, "disk_rblk"); if (p==NULL) { error ("parse(/proc/stat) failed: neither 'disk_io' nor 'disk_rblk' found"); fd=-1; return -1; } if (sscanf(p+9, "%lu %lu %lu %lu", &r1, &r2, &r3, &r4)!=4) { error ("parse(/proc/stat) failed: unknown 'disk_rblk' format"); fd=-1; return -1; } p=strstr(buffer, "disk_wblk"); if (p==NULL) { error ("parse(/proc/stat) failed: no 'disk_wblk' line"); fd=-1; return -1; } if (sscanf(p+9, "%lu %lu %lu %lu", &w1, &w2, &w3, &w4)!=4) { error ("parse(/proc/stat) failed: unknown 'disk_wblk' format"); fd=-1; return -1; } *r=smooth ("disk_r", 500, r1+r2+r3+r4); *w=smooth ("disk_w", 500, w1+w2+w3+w4); } return 0;}int Net (int *rx, int *tx, int *bytes){ char buffer[4096], *p, *s; static int fd=-2; unsigned long pkg_rx, pkg_tx; *rx=0; *tx=0; *bytes=0; if (fd==-1) return -1; if (fd==-2) { fd = open("/proc/net/dev", O_RDONLY | O_NDELAY); if (fd==-1) { error ("open(/proc/net/dev) failed: %s", strerror(errno)); return -1; } debug ("open (/proc/net/dev)=%d", fd); } if (lseek(fd, 0L, SEEK_SET)!=0) { error ("lseek(/proc/net/dev) failed: %s", strerror(errno)); fd=-1; return -1; } if (read (fd, &buffer, sizeof(buffer)-1)==-1) { error ("read(/proc/net/dev) failed: %s", strerror(errno)); fd=-1; return -1; } pkg_rx=0; pkg_tx=0; p=buffer; while ((s=strsep(&p, "\n"))) { int n, u; unsigned long v[16]={0}; n=sscanf (s, " eth%d:%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu", &u, &v[0], &v[1], &v[2], &v[3], &v[4], &v[5], &v[6], &v[7], &v[8], &v[9], &v[10], &v[11], &v[12], &v[13], &v[14], &v[15]); if (n==17) { pkg_rx+=v[0]; pkg_tx+=v[8]; *bytes=1; } else if (n==12) { pkg_rx+=v[0]; pkg_tx+=v[5]; *bytes=0; } else if (n>0) { error ("parse(/proc/net/dev) failed: unknown format"); fd=-1; return -1; } } *rx=smooth("net_rx", 500, pkg_rx); *tx=smooth("net_tx", 500, pkg_tx); return 0;}int PPP (int unit, int *rx, int *tx){ static int fd=-2; char buffer[16]; #ifdef HAVE_NET_IF_PPP_H struct ifpppstatsreq req;#endif *rx=0; *tx=0;#ifdef HAVE_NET_IF_PPP_H if (fd==-1) return -1; if (fd==-2) { fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd==-1) { error ("socket() failed: %s", strerror(errno)); return -1; } debug ("socket()=%d", fd); } memset (&req, 0, sizeof (req)); req.stats_ptr = (caddr_t) &req.stats; snprintf (req.ifr__name, sizeof(req.ifr__name), "ppp%d", unit); if (ioctl(fd, SIOCGPPPSTATS, &req) < 0) return 0; snprintf (buffer, sizeof(buffer), "ppp%d_rx", unit); *rx=smooth(buffer, 500, req.stats.p.ppp_ibytes); snprintf (buffer, sizeof(buffer), "ppp%d_tx", unit); *tx=smooth(buffer, 500, req.stats.p.ppp_obytes);#endif return 0;}int Sensor (int index, double *val, double *min, double *max){ char buffer[32]; double dummy, value; static int fd[SENSORS+1]={[0 ... SENSORS]=-2,}; static char *sensor[SENSORS+1]={NULL,}; static double val_buf[SENSORS+1]={0.0,}; static double min_buf[SENSORS+1]={0.0,}; static double max_buf[SENSORS+1]={0.0,}; static double factor_buf[SENSORS+1]={0.0,}; static double offset_buf[SENSORS+1]={0.0,}; static time_t now[SENSORS+1]={0,}; if (index<0 || index>SENSORS) return -1; *val=val_buf[index]; *min=min_buf[index]; *max=max_buf[index]; if (fd[index]==-1) return -1; if (time(NULL)==now[index]) return 0; time(&now[index]); if (fd[index]==-2) { snprintf(buffer, 32, "Sensor%d", index); sensor[index]=cfg_get(buffer, NULL); if (sensor[index]==NULL || *sensor[index]=='\0') { error ("no entry for '%s' in %s", buffer, cfg_source()); fd[index]=-1; return -1; } snprintf(buffer, 32, "Sensor%d_min", index); min_buf[index]=atof(cfg_get(buffer,"0")); *min=min_buf[index]; snprintf(buffer, 32, "Sensor%d_max", index); max_buf[index]=atof(cfg_get(buffer,"100")); *max=max_buf[index]; snprintf(buffer, 32, "Sensor%d_factor", index); factor_buf[index]=atof(cfg_get(buffer,"1")); snprintf(buffer, 32, "Sensor%d_offset", index); offset_buf[index]=atof(cfg_get(buffer,"0")); fd[index]=open(sensor[index], O_RDONLY); if (fd[index]==-1) { error ("open(%s) failed: %s", sensor[index], strerror(errno)); return -1; } debug ("open (%s)=%d", sensor[index], fd[index]); } if (lseek(fd[index], 0L, SEEK_SET)!=0) { error ("lseek(%s) failed: %s", sensor[index], strerror(errno)); fd[index]=-1; return -1; } if (read (fd[index], &buffer, sizeof(buffer)-1)==-1) { error ("read(%s) failed: %s", sensor[index], strerror(errno)); fd[index]=-1; return -1; } if (sscanf(buffer, "%lf %lf %lf", &dummy, &dummy, &value)!=3) { error ("parse(%s) failed: unknown format", sensor[index]); fd[index]=-1; return -1; } value *= factor_buf[index]; value += offset_buf[index]; val_buf[index]=value; *val=value; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -