ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/examples/disk_traffic.c
Revision: 1.9
Committed: Mon Apr 5 16:23:08 2004 UTC (20 years, 8 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.8: +6 -6 lines
Log Message:
Update examples to use new names. I guess some renaming could probably be
done here, but at least they all compile again now.

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 program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program 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
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 *
20 * $Id: disk_traffic.c,v 1.8 2004/04/04 22:48:49 tdb Exp $
21 */
22
23 /* A very basic example of how to get the disk statistics from the system
24 * and diaply them. Also it adds up all the traffic to create and print out
25 * a total
26 * Takes several arguments :
27 * -d <number> Takes the number of seconds to wait to get traffic sent since last call
28 * Note, this is not disk traffic per second. Its the traffic since last
29 * call. If you want it traffic per second averaged over time since last call
30 * You need to divide against the time since last time this was called. The time
31 * between 2 calls is stored in systime in the disk_stat_t structure.
32 * -b Display in bytes
33 * -k Display in kilobytes
34 * -m Display in megabytes
35 */
36
37 #include <stdio.h>
38 #include <statgrab.h>
39 #include <stdlib.h>
40 #include <unistd.h>
41
42 int main(int argc, char **argv){
43
44 extern char *optarg;
45 int c;
46
47 /* We default to 1 second updates and displaying in bytes*/
48 int delay = 1;
49 char units = 'b';
50
51 sg_disk_io_stats *diskio_stats;
52 int num_diskio_stats;
53
54 /* Parse command line options */
55 while ((c = getopt(argc, argv, "d:bkm")) != -1){
56 switch (c){
57 case 'd':
58 delay = atoi(optarg);
59 break;
60 case 'b':
61 units = 'b';
62 break;
63 case 'k':
64 units = 'k';
65 break;
66 case 'm':
67 units = 'm';
68 break;
69 }
70 }
71
72 /* Initialise statgrab */
73 sg_init();
74
75 /* Drop setuid/setgid privileges. */
76 if (sg_drop_privileges() != 0) {
77 perror("Error. Failed to drop privileges");
78 return 1;
79 }
80
81 /* We are not interested in the amount of traffic ever transmitted, just differences.
82 * Because of this, we do nothing for the very first call.
83 */
84
85 diskio_stats = sg_get_disk_io_stats_diff(&num_diskio_stats);
86 if (diskio_stats == NULL){
87 perror("Error. Failed to get disk stats");
88 return 1;
89 }
90
91 /* Clear the screen ready for display the disk stats */
92 printf("\033[2J");
93
94 /* Keep getting the disk stats */
95 while ( (diskio_stats = sg_get_disk_io_stats_diff(&num_diskio_stats)) != NULL){
96 int x;
97 int line_number = 2;
98
99 long long total_write=0;
100 long long total_read=0;
101
102 for(x = 0; x < num_diskio_stats; x++){
103 /* Print at location 2, linenumber the interface name */
104 printf("\033[%d;2H%-25s : %-10s", line_number++, "Disk Name", diskio_stats->disk_name);
105 /* Print out at the correct location the traffic in the requsted units passed at command time */
106 switch(units){
107 case 'b':
108 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Disk read", diskio_stats->read_bytes);
109 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Disk write", diskio_stats->write_bytes);
110 break;
111 case 'k':
112 printf("\033[%d;2H%-25s : %5lld k", line_number++, "Disk read", (diskio_stats->read_bytes / 1024));
113 printf("\033[%d;2H%-25s : %5lld", line_number++, "Disk write", (diskio_stats->write_bytes / 1024));
114 break;
115 case 'm':
116 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Disk read", diskio_stats->read_bytes / (1024.00*1024.00));
117 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Disk write", diskio_stats->write_bytes / (1024.00*1024.00));
118 }
119 printf("\033[%d;2H%-25s : %ld ", line_number++, "Disk systime", (long) diskio_stats->systime);
120
121 /* Add a blank line between interfaces */
122 line_number++;
123
124 /* Add up this interface to the total so we can display a "total" disk io" */
125 total_write+=diskio_stats->write_bytes;
126 total_read+=diskio_stats->read_bytes;
127
128 /* Move the pointer onto the next interface. Since this returns a static buffer, we dont need
129 * to keep track of the orginal pointer to free later */
130 diskio_stats++;
131 }
132
133 printf("\033[%d;2H%-25s : %-10s", line_number++, "Disk Name", "Total Disk IO");
134 switch(units){
135 case 'b':
136 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Disk Total read", total_read);
137 printf("\033[%d;2H%-25s : %8lld b", line_number++, "Disk Total write", total_write);
138 break;
139 case 'k':
140 printf("\033[%d;2H%-25s : %5lld k", line_number++, "Disk Total read", (total_read / 1024));
141 printf("\033[%d;2H%-25s : %5lld k", line_number++, "Disk Total write", (total_write / 1024));
142 break;
143 case 'm':
144 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Disk Total read", (total_read / (1024.00*1024.00)));
145 printf("\033[%d;2H%-25s : %5.2f m", line_number++, "Disk Total write", (total_write / (1024.00*1024.00)));
146 break;
147 }
148
149 fflush(stdout);
150
151 sleep(delay);
152
153 }
154
155 return 0;
156
157 }