ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/process_stats.c
Revision: 1.23
Committed: Sun Mar 28 18:04:14 2004 UTC (20 years, 1 month ago) by pajs
Content type: text/plain
Branch: MAIN
Changes since 1.22: +49 -143 lines
Log Message:
The start of the rework for process_stats to give more information, and
to become a standard proc interface.

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.22 2004/02/16 14:55:32 tdb 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)
64 DIR *proc_dir;
65 struct dirent *dir_entry;
66 char filename[MAX_FILE_LENGTH];
67 FILE *f;
68 psinfo_t process_info;
69
70 if((proc_dir=opendir(PROC_LOCATION))==NULL){
71 return NULL;
72 }
73
74 while((dir_entry=readdir(proc_dir))!=NULL){
75 if(atoi(dir_entry->d_name) == 0) continue;
76
77 snprintf(filename, MAX_FILE_LENGTH, "/proc/%s/psinfo", dir_entry->d_name);
78
79 if((f=fopen(filename, "r"))==NULL){
80 /* Open failed.. Process since vanished, or the path was too long.
81 * Ah well, move onwards to the next one */
82 continue;
83 }
84 fread(&process_info, sizeof(psinfo_t), 1, f);
85
86 proc_state = realloc(proc_state, (1+proc_state_size)*sizeof(proc_state_t));
87
88 proc_state_ptr = proc_state+proc_state_size;
89
90 proc_state_ptr->pid = process_info.pr_pid;
91 proc_state_ptr->parent = process_info.pr_ppid;
92 proc_state_ptr->pgid = process_info.pr_pgid;
93 proc_state_ptr->uid = process_info.pr_uid;
94 proc_state_ptr->euid = process_info.pr_euid;
95 proc_state_ptr->gid = process_info.pr_gid;
96 proc_state_ptr->egid = process_info.pr_egid;
97 proc_state_ptr->proc_size = (process_info.pr_size) * 1024;
98 proc_state_ptr->proc_resident = (process_info.pr_rssize) * 1024;
99 proc_state_ptr->time_spent = process_info.pr_time.tv_sec;
100 proc_state_ptr->cpu_percent = (process_info.pr_pctcpu * 100.0) / 0x8000;
101 proc_state_ptr->process_name = strdup(process_info.pr_fname);
102 proc_state_ptr->proctitle = strdup(process_info.pr_psargs);
103
104 proc_state_size++;
105 #endif
106
107
108 fclose(f);
109 }
110 closedir(proc_dir);
111 *ps = proc_state;
112
113 return proc_state_size;
114 }
115