ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/examples/disk_traffic.c
Revision: 1.10
Committed: Tue Apr 6 14:52:56 2004 UTC (20 years ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_17, LIBSTATGRAB_0_16, LIBSTATGRAB_0_15, LIBSTATGRAB_0_14, LIBSTATGRAB_0_13, LIBSTATGRAB_0_12, LIBSTATGRAB_0_11_1, LIBSTATGRAB_0_11, LIBSTATGRAB_0_10_3, LIBSTATGRAB_0_10_2, LIBSTATGRAB_0_10_1, LIBSTATGRAB_0_10, HEAD
Changes since 1.9: +2 -2 lines
Log Message:
Update name of project at the top of all soure files. These files now exist
in their own right, rather than as part of the "CMS".

File Contents

# User Rev Content
1 pajs 1.1 /*
2 tdb 1.10 * i-scream libstatgrab
3 tdb 1.2 * http://www.i-scream.org
4 tdb 1.6 * Copyright (C) 2000-2004 i-scream
5 pajs 1.1 *
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 tdb 1.7 *
20 tdb 1.10 * $Id: disk_traffic.c,v 1.9 2004/04/05 16:23:08 tdb Exp $
21 pajs 1.1 */
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 tdb 1.4 * -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 pajs 1.1 * 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 tdb 1.4 * -m Display in megabytes
35 pajs 1.1 */
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 tdb 1.9 sg_disk_io_stats *diskio_stats;
52 pajs 1.1 int num_diskio_stats;
53    
54     /* Parse command line options */
55 ats 1.3 while ((c = getopt(argc, argv, "d:bkm")) != -1){
56 pajs 1.1 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 tdb 1.4 /* Initialise statgrab */
73 tdb 1.9 sg_init();
74 tdb 1.4
75 tdb 1.5 /* Drop setuid/setgid privileges. */
76 tdb 1.9 if (sg_drop_privileges() != 0) {
77 tdb 1.5 perror("Error. Failed to drop privileges");
78     return 1;
79     }
80    
81 tdb 1.4 /* We are not interested in the amount of traffic ever transmitted, just differences.
82 pajs 1.1 * Because of this, we do nothing for the very first call.
83     */
84 tdb 1.4
85 tdb 1.9 diskio_stats = sg_get_disk_io_stats_diff(&num_diskio_stats);
86 pajs 1.1 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 tdb 1.4
94 pajs 1.1 /* Keep getting the disk stats */
95 tdb 1.9 while ( (diskio_stats = sg_get_disk_io_stats_diff(&num_diskio_stats)) != NULL){
96 pajs 1.1 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 tdb 1.4 printf("\033[%d;2H%-25s : %5lld", line_number++, "Disk write", (diskio_stats->write_bytes / 1024));
114     break;
115 pajs 1.1 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 tdb 1.4
121 pajs 1.1 /* 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 tdb 1.4
133 pajs 1.1 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 tdb 1.4
149 pajs 1.1 fflush(stdout);
150    
151     sleep(delay);
152    
153     }
154    
155     return 0;
156    
157     }