ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/ihost/libstatgrab/process_stats.c
Revision: 1.2
Committed: Tue May 14 16:47:24 2002 UTC (22 years, 6 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.1: +0 -5 lines
Log Message:
Fixed two minor mistakes.

File Contents

# User Rev Content
1 pajs 1.1 #include <stdio.h>
2     #include "ukcprog.h"
3     #include <string.h>
4     #ifdef LINUX
5     #include <dirent.h>
6     #include <unistd.h>
7     #include <stdlib.h>
8     #endif
9     char *get_process_stats(){
10     char *xml_ps_stats;
11     int zombie=0;
12     int sleeping=0;
13     int running=0;
14     int stopped=0;
15     FILE *f;
16     char *line;
17     char *line_p;
18     #ifdef LINUX
19     DIR *procdir;
20     struct dirent *procent;
21     char fname[_POSIX_PATH_MAX];
22     #endif
23    
24     #ifdef SOLARIS
25     #define SOL_PS_CMD "/bin/ps -Al"
26     if((f=popen(SOL_PS_CMD, "r")) == NULL) {
27     errf("Failed to execute the PS command (%m)");
28     return NULL;
29     }
30    
31     /* Throw away the first line as its the header from PS */
32     fpgetline(f);
33    
34     while((line=fpgetline(f)) != NULL) {
35     line_p=line;
36     for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
37     line_p=strchr(line_p, ' ');
38     for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
39     if (line_p==NULL) abort();
40     /* Ok, we should now be at the state :) .. */
41     if (*line_p=='S') sleeping++;
42     if (*line_p=='R') running++;
43     if (*line_p=='Z') zombie++;
44     if (*line_p=='T') stopped++;
45     }
46    
47     if((pclose(f)) == -1) {
48     errf("Failed to close process stats (%m)");
49     return NULL;
50     }
51     #endif
52     #ifdef FREEBSD
53     #define FREEBSD_PS_CMD "/bin/ps -ax"
54    
55     if((f=popen(FREEBSD_PS_CMD, "r")) == NULL) {
56     errf("Failed to execute ps");
57     return NULL;
58     }
59    
60     /* Throw away first line */
61     fpgetline(f);
62     while((line=fpgetline(f)) != NULL) {
63     line_p=line;
64     for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
65     line_p=strchr(line_p, ' ');
66     for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
67     line_p=strchr(line_p, ' ');
68     for(; (*line_p == ' ') && (*line_p != '\0'); line_p++);
69     if (line_p==NULL) abort();
70    
71     if (*line_p=='S') sleeping++;
72     if (*line_p=='I') sleeping++;
73     if (*line_p=='R') running++;
74     if (*line_p=='D') running++;
75     if (*line_p=='Z') zombie++;
76     if (*line_p=='T') stopped++;
77     if (*line_p=='J') running++;
78     }
79    
80     if((pclose(f)) != 0) {
81     errf("Failed to close ps (%m)");
82     return NULL;
83     }
84     #endif
85     #ifdef LINUX
86     chdir("/proc");
87     if((procdir=opendir(".")) == NULL){
88     errf("Failed to open proc (%m)");
89     return NULL;
90     }
91    
92     while((procent = readdir(procdir)) != NULL){
93     if(atoi(procent->d_name) == 0) continue;
94     strncpy(fname, procent->d_name, _POSIX_PATH_MAX-7);
95     strcat(fname, "/status");
96    
97     if((f=fopen(fname, "r")) == NULL){
98     errf("Failed to open process stat (%m)");
99     return NULL;
100     }
101    
102     while((line=fpgetline(f)) != NULL){
103     if(strncasecmp(line,"State:",6)==0) break;
104     }
105    
106     line_p=line;
107     for(;*line_p++ != '\t';);
108    
109    
110     if(*line_p=='R') running++;
111     if(*line_p=='S') sleeping++;
112     if(*line_p=='Z') zombie++;
113     if(*line_p=='T') stopped++;
114     if(*line_p=='D') stopped++;
115    
116     }
117     closedir(procdir);
118     #endif
119    
120    
121     if((xml_ps_stats=strf("<processes><sleeping>%d</sleeping><cpu>%d</cpu><zombie>%d</zombie><stopped>%d</stopped><total>%d</total></processes>", sleeping, running, zombie, stopped, (sleeping+running+zombie+stopped))) == NULL){
122     errf("strf failed");
123     return NULL;
124     }
125     return xml_ps_stats;
126     }