ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/process_stats.c
Revision: 1.24
Committed: Sun Mar 28 18:22:58 2004 UTC (20 years, 1 month ago) by pajs
Content type: text/plain
Branch: MAIN
Changes since 1.23: +14 -4 lines
Log Message:
Added the state for solaris

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2004 i-scream
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 * 02111-1307 USA
20 *
21 * $Id: process_stats.c,v 1.23 2004/03/28 18:04:14 pajs Exp $
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include "statgrab.h"
29 #if defined(SOLARIS) || defined(LINUX)
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <sys/types.h>
33 #include <dirent.h>
34 #include <string.h>
35 #endif
36
37 #ifdef SOLARIS
38 #include <procfs.h>
39 #include <limits.h>
40 #define PROC_LOCATION "/proc"
41 #define MAX_FILE_LENGTH PATH_MAX
42 #endif
43 #ifdef LINUX
44 #include <limits.h>
45 #define PROC_LOCATION "/proc"
46 #define MAX_FILE_LENGTH PATH_MAX
47 #endif
48 #ifdef ALLBSD
49 #include <stdlib.h>
50 #include <sys/param.h>
51 #include <sys/sysctl.h>
52 #if defined(FREEBSD) || defined(DFBSD)
53 #include <sys/user.h>
54 #else
55 #include <sys/proc.h>
56 #endif
57 #endif
58
59 int get_proc_snapshot(proc_state_t **ps){
60 proc_state_t *proc_state = NULL;
61 proc_state_t *proc_state_ptr;
62 int proc_state_size = 0;
63 #if defined(SOLARIS) || defined(LINUX)
64 DIR *proc_dir;
65 struct dirent *dir_entry;
66 char filename[MAX_FILE_LENGTH];
67 FILE *f;
68 #ifdef SOLARIS
69 psinfo_t process_info;
70 #endif
71
72 if((proc_dir=opendir(PROC_LOCATION))==NULL){
73 return NULL;
74 }
75
76 while((dir_entry=readdir(proc_dir))!=NULL){
77 if(atoi(dir_entry->d_name) == 0) continue;
78
79 #ifdef SOLARIS
80 snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/psinfo", dir_entry->d_name);
81 #endif
82 if((f=fopen(filename, "r"))==NULL){
83 /* Open failed.. Process since vanished, or the path was too long.
84 * Ah well, move onwards to the next one */
85 continue;
86 }
87 #ifdef SOLARIS
88 fread(&process_info, sizeof(psinfo_t), 1, f);
89
90 proc_state = realloc(proc_state, (1+proc_state_size)*sizeof(proc_state_t));
91 proc_state_ptr = proc_state+proc_state_size;
92
93 proc_state_ptr->pid = process_info.pr_pid;
94 proc_state_ptr->parent = process_info.pr_ppid;
95 proc_state_ptr->pgid = process_info.pr_pgid;
96 proc_state_ptr->uid = process_info.pr_uid;
97 proc_state_ptr->euid = process_info.pr_euid;
98 proc_state_ptr->gid = process_info.pr_gid;
99 proc_state_ptr->egid = process_info.pr_egid;
100 proc_state_ptr->proc_size = (process_info.pr_size) * 1024;
101 proc_state_ptr->proc_resident = (process_info.pr_rssize) * 1024;
102 proc_state_ptr->time_spent = process_info.pr_time.tv_sec;
103 proc_state_ptr->cpu_percent = (process_info.pr_pctcpu * 100.0) / 0x8000;
104 proc_state_ptr->process_name = strdup(process_info.pr_fname);
105 proc_state_ptr->proctitle = strdup(process_info.pr_psargs);
106
107 if(process_info.pr_lwp.pr_state==1) proc_state_ptr->state = SLEEPING;
108 if(process_info.pr_lwp.pr_state==2) proc_state_ptr->state = RUNNING;
109 if(process_info.pr_lwp.pr_state==3) proc_state_ptr->state = ZOMBIE;
110 if(process_info.pr_lwp.pr_state==4) proc_state_ptr->state = STOPPED;
111 if(process_info.pr_lwp.pr_state==6) proc_state_ptr->state = RUNNING;
112 #endif
113
114 proc_state_size++;
115 #endif
116
117
118 fclose(f);
119 }
120 closedir(proc_dir);
121 *ps = proc_state;
122
123 return proc_state_size;
124 }
125