sys-proctable 0.7.5 → 0.7.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +17 -1
- data/MANIFEST +1 -1
- data/README +38 -29
- data/ext/extconf.rb +1 -3
- data/ext/sunos/sunos.c +374 -0
- data/ext/sunos/sunos.h +177 -0
- data/ext/version.h +1 -1
- data/test/tc_all.rb +23 -29
- data/test/tc_freebsd.rb +0 -19
- data/test/tc_hpux.rb +0 -18
- data/test/tc_kvm_bsd.rb +0 -14
- data/test/tc_linux.rb +2 -18
- data/test/tc_sunos.rb +0 -17
- data/test/tc_top.rb +0 -8
- data/test/tc_windows.rb +0 -9
- metadata +16 -16
- data/ext/linux/linux.c +0 -320
- data/ext/linux/linux.h +0 -138
data/ext/sunos/sunos.h
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
/*****************************************************************************
|
2
|
+
* solaris.h
|
3
|
+
*
|
4
|
+
* Solaris specific header file. Some things copy/pasted straight out
|
5
|
+
* of Dan Urist's Proc::ProcessTable Perl module.
|
6
|
+
*****************************************************************************/
|
7
|
+
#include <stdio.h>
|
8
|
+
#include <stdlib.h>
|
9
|
+
#include <dirent.h>
|
10
|
+
#include <sys/param.h>
|
11
|
+
#include <sys/types.h>
|
12
|
+
#include <sys/proc.h>
|
13
|
+
#include <fcntl.h>
|
14
|
+
#include <string.h>
|
15
|
+
#include <unistd.h>
|
16
|
+
#include <utmpx.h>
|
17
|
+
|
18
|
+
/* This bit of magic was taken from a post by Stefan Teleman on the KDE
|
19
|
+
* mailing list. It allows us to build without having to disable largefile
|
20
|
+
* support or explicitly build a 64 bit Ruby.
|
21
|
+
*/
|
22
|
+
#if (!defined(_LP64)) && (_FILE_OFFSET_BITS - 0 == 64)
|
23
|
+
#define PROCFS_FILE_OFFSET_BITS_HACK 1
|
24
|
+
#undef _FILE_OFFSET_BITS
|
25
|
+
#else
|
26
|
+
#define PROCFS_FILE_OFFSET_BITS_HACK 0
|
27
|
+
#endif
|
28
|
+
|
29
|
+
#if defined(HAVE_PROCFS_H)
|
30
|
+
#include <procfs.h>
|
31
|
+
#else
|
32
|
+
#include <sys/procfs.h>
|
33
|
+
#endif
|
34
|
+
|
35
|
+
#if (PROCFS_FILE_OFFSET_BITS_HACK - 0 == 1)
|
36
|
+
#define _FILE_OFFSET_BITS 64
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#ifndef CLK_TCK
|
40
|
+
#define CLK_TCK sysconf(_SC_CLK_TCK)
|
41
|
+
#endif
|
42
|
+
|
43
|
+
#ifndef NAME_MAX
|
44
|
+
#define NAME_MAX 255
|
45
|
+
#endif
|
46
|
+
|
47
|
+
/* Ruby 1.8.3 or later */
|
48
|
+
#ifdef HAVE_TYPE_RB_PID_T
|
49
|
+
#define pid_t rb_pid_t
|
50
|
+
#endif
|
51
|
+
|
52
|
+
#define COMM_MAX 64
|
53
|
+
#define STATE_MAX 20
|
54
|
+
#define WCHAN_MAX 64
|
55
|
+
|
56
|
+
/* Function prototypes */
|
57
|
+
static void getprusage(pid_t pid, prusage_t* pr_usage);
|
58
|
+
|
59
|
+
/* Process state strings that we return */
|
60
|
+
#define SLEEP "sleep"
|
61
|
+
#define WAIT "wait"
|
62
|
+
#define RUN "run"
|
63
|
+
#define IDLE "idle"
|
64
|
+
#define ZOMBIE "zombie"
|
65
|
+
#define STOP "stop"
|
66
|
+
#define ONPROC "onprocessor"
|
67
|
+
|
68
|
+
/*
|
69
|
+
* A simple static structure, mainly for use with the 'fields()' class method.
|
70
|
+
* The fields here *should* be identical to the fields listed in the ps_struct.
|
71
|
+
* The exception is the 'comm' field, which I added to give it a bit of
|
72
|
+
* (foolish?) consistency with the other platforms. I will try to make sure
|
73
|
+
* that field is common to all platforms.
|
74
|
+
*/
|
75
|
+
static char* fields[] = {
|
76
|
+
"flag",
|
77
|
+
#ifdef HAVE_PROCFS_H
|
78
|
+
"nlwp",
|
79
|
+
#endif
|
80
|
+
"pid",
|
81
|
+
"ppid",
|
82
|
+
"pgid",
|
83
|
+
"sid",
|
84
|
+
"uid",
|
85
|
+
"euid",
|
86
|
+
"gid",
|
87
|
+
"egid",
|
88
|
+
"priority",
|
89
|
+
"nice",
|
90
|
+
"ttydev",
|
91
|
+
"time",
|
92
|
+
"ctime",
|
93
|
+
"size",
|
94
|
+
"rss",
|
95
|
+
"wchan",
|
96
|
+
"pctcpu",
|
97
|
+
"pctmem",
|
98
|
+
"state",
|
99
|
+
"fname",
|
100
|
+
"cmdline",
|
101
|
+
"start",
|
102
|
+
#ifdef HAVE_PROCFS_H
|
103
|
+
"processor",
|
104
|
+
#endif
|
105
|
+
"comm",
|
106
|
+
"num_args",
|
107
|
+
"cmd_args",
|
108
|
+
"lwpid",
|
109
|
+
"count",
|
110
|
+
"tstamp",
|
111
|
+
"create",
|
112
|
+
"term",
|
113
|
+
"rtime",
|
114
|
+
"utime",
|
115
|
+
"stime",
|
116
|
+
"ttime",
|
117
|
+
"tftime",
|
118
|
+
"dftime",
|
119
|
+
"kftime",
|
120
|
+
"ltime",
|
121
|
+
"slptime",
|
122
|
+
"wtime",
|
123
|
+
"stoptime",
|
124
|
+
"minf",
|
125
|
+
"majf",
|
126
|
+
"nswap",
|
127
|
+
"inblk",
|
128
|
+
"oublk",
|
129
|
+
"msnd",
|
130
|
+
"mrcv",
|
131
|
+
"sigs",
|
132
|
+
"vctx",
|
133
|
+
"ictx",
|
134
|
+
"sysc",
|
135
|
+
"ioch"
|
136
|
+
};
|
137
|
+
|
138
|
+
/*
|
139
|
+
* Private function for getting data out of the /proc/self/usage directory.
|
140
|
+
* Based on Rich Teer's function in "Solaris Systems Programming", p.329
|
141
|
+
* and p.332.
|
142
|
+
*/
|
143
|
+
#if defined(HAVE_PROCFS_H)
|
144
|
+
static void getprusage(pid_t pid, prusage_t* pr_usage){
|
145
|
+
int fd;
|
146
|
+
char name[PATH_MAX];
|
147
|
+
|
148
|
+
snprintf(name, PATH_MAX, "/proc/%ld/usage", (long)pid);
|
149
|
+
|
150
|
+
if((fd = open(name, O_RDONLY)) == -1)
|
151
|
+
rb_sys_fail(0);
|
152
|
+
|
153
|
+
if(read(fd,pr_usage,sizeof(prusage_t)) == -1){
|
154
|
+
close(fd);
|
155
|
+
rb_sys_fail(0);
|
156
|
+
}
|
157
|
+
|
158
|
+
close(fd);
|
159
|
+
}
|
160
|
+
#else
|
161
|
+
static void getprusage(pid_t pid, prusage_t* pr_usage){
|
162
|
+
int fd;
|
163
|
+
char name[PATH_MAX];
|
164
|
+
|
165
|
+
snprintf(name, PATH_MAX, "/proc/%ld", (long)pid);
|
166
|
+
|
167
|
+
if((fd = open(name, O_RDONLY)) == -1)
|
168
|
+
rb_sys_fail(0);
|
169
|
+
|
170
|
+
if(ioctl(fd,PIOCUSAGE,pr_usage) == -1){
|
171
|
+
close(fd);
|
172
|
+
rb_sys_fail(0);
|
173
|
+
}
|
174
|
+
|
175
|
+
close(fd);
|
176
|
+
}
|
177
|
+
#endif
|
data/ext/version.h
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
/* version.h - stores the version number for all platforms (that use C) */
|
2
|
-
#define SYS_PROCTABLE_VERSION "0.7.
|
2
|
+
#define SYS_PROCTABLE_VERSION "0.7.6"
|
data/test/tc_all.rb
CHANGED
@@ -1,35 +1,22 @@
|
|
1
|
-
|
1
|
+
#######################################################################
|
2
2
|
# tc_all.rb
|
3
3
|
#
|
4
|
-
# Test suite for methods common to all platforms.
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
require 'fileutils'
|
10
|
-
Dir.chdir '..' if base == 'test'
|
11
|
-
|
12
|
-
if RUBY_PLATFORM.match('mswin')
|
13
|
-
File.rename('lib/sys/windows.rb', 'lib/sys/proctable.rb')
|
14
|
-
else
|
15
|
-
require 'rbconfig'
|
16
|
-
file = 'ext/proctable.' + Config::CONFIG['DLEXT']
|
17
|
-
Dir.mkdir('sys') unless File.exists?('sys')
|
18
|
-
FileUtils.cp(file, 'sys')
|
19
|
-
end
|
20
|
-
|
21
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
22
|
-
$LOAD_PATH.unshift(Dir.pwd + '/lib')
|
23
|
-
end
|
24
|
-
|
4
|
+
# Test suite for methods common to all platforms. Generally speaking
|
5
|
+
# you should run this test case using the 'rake test' task.
|
6
|
+
#######################################################################
|
7
|
+
require 'socket'
|
25
8
|
require 'test/unit'
|
26
9
|
require 'sys/proctable'
|
27
10
|
include Sys
|
28
11
|
|
29
12
|
class TC_ProcTable_All < Test::Unit::TestCase
|
13
|
+
def setup
|
14
|
+
@host = Socket.gethostname
|
15
|
+
@pid = RUBY_PLATFORM.match('mswin') ? 0 : 1
|
16
|
+
end
|
30
17
|
|
31
18
|
def test_version
|
32
|
-
assert_equal('0.7.
|
19
|
+
assert_equal('0.7.6', ProcTable::VERSION)
|
33
20
|
end
|
34
21
|
|
35
22
|
def test_fields
|
@@ -49,17 +36,24 @@ class TC_ProcTable_All < Test::Unit::TestCase
|
|
49
36
|
assert_nothing_raised{ ProcTable.ps(0) }
|
50
37
|
assert_nothing_raised{ ProcTable.ps(nil) }
|
51
38
|
assert_raises(TypeError){ ProcTable.ps('vim') }
|
52
|
-
|
39
|
+
|
40
|
+
if RUBY_PLATFORM.match('mswin')
|
41
|
+
assert_nothing_raised{ ProcTable.ps(0, @host) }
|
42
|
+
assert_raises(ArgumentError){ ProcTable.ps(0, @host, 1) }
|
43
|
+
else
|
44
|
+
assert_raises(ArgumentError){ ProcTable.ps(0, @host) }
|
45
|
+
end
|
53
46
|
end
|
54
47
|
|
55
48
|
def test_ps_return_values
|
56
49
|
assert_kind_of(Array, ProcTable.ps)
|
57
|
-
assert_kind_of(Struct::ProcTableStruct, ProcTable.ps(
|
50
|
+
assert_kind_of(Struct::ProcTableStruct, ProcTable.ps(@pid))
|
58
51
|
assert_equal(nil, ProcTable.ps(999999999))
|
59
52
|
assert_equal(nil, ProcTable.ps{})
|
60
53
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
54
|
+
|
55
|
+
def teardown
|
56
|
+
@host = nil
|
57
|
+
@pid = nil
|
58
|
+
end
|
65
59
|
end
|
data/test/tc_freebsd.rb
CHANGED
@@ -3,27 +3,12 @@
|
|
3
3
|
#
|
4
4
|
# Test suite for sys-proctable for FreeBSD.
|
5
5
|
############################################
|
6
|
-
base = File.basename(Dir.pwd)
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
require 'fileutils'
|
10
|
-
require 'rbconfig'
|
11
|
-
|
12
|
-
Dir.chdir '..' if base == 'test'
|
13
|
-
file = 'ext/proctable.' + Config::CONFIG['DLEXT']
|
14
|
-
Dir.mkdir('sys') unless File.exists?('sys')
|
15
|
-
FileUtils.cp(file, 'sys')
|
16
|
-
|
17
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
18
|
-
end
|
19
|
-
|
20
6
|
require "sys/proctable"
|
21
7
|
require "test/unit"
|
22
8
|
require "test/tc_all"
|
23
9
|
include Sys
|
24
10
|
|
25
11
|
class TC_ProcTable_FreeBSD < Test::Unit::TestCase
|
26
|
-
|
27
12
|
def setup
|
28
13
|
@fields = %w/
|
29
14
|
comm pid ppid pgid sid tdev_maj tdev_min flags start
|
@@ -57,8 +42,4 @@ class TC_ProcTable_FreeBSD < Test::Unit::TestCase
|
|
57
42
|
@fields = nil
|
58
43
|
@pt = nil
|
59
44
|
end
|
60
|
-
|
61
|
-
alias :set_up :setup
|
62
|
-
alias :tear_down :teardown
|
63
|
-
|
64
45
|
end
|
data/test/tc_hpux.rb
CHANGED
@@ -3,27 +3,12 @@
|
|
3
3
|
#
|
4
4
|
# Test case for sys-proctable for HP-UX.
|
5
5
|
##################################################
|
6
|
-
base = File.basename(Dir.pwd)
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
require 'fileutils'
|
10
|
-
require 'rbconfig'
|
11
|
-
|
12
|
-
Dir.chdir('..') if base == 'test'
|
13
|
-
file = 'ext/proctable.' + Config::CONFIG['DLEXT']
|
14
|
-
Dir.mkdir('sys') unless File.exists?('sys')
|
15
|
-
FileUtils.cp(file, 'sys')
|
16
|
-
|
17
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
18
|
-
end
|
19
|
-
|
20
6
|
require "sys/proctable"
|
21
7
|
require "test/unit"
|
22
8
|
require "test/tc_all"
|
23
9
|
include Sys
|
24
10
|
|
25
11
|
class TC_ProcTable_HPUX < Test::Unit::TestCase
|
26
|
-
|
27
12
|
def setup
|
28
13
|
@fields = %w/
|
29
14
|
comm uid pid ppid dsize tsize ssize nice ttydev pgrp pri addr
|
@@ -61,7 +46,4 @@ class TC_ProcTable_HPUX < Test::Unit::TestCase
|
|
61
46
|
@fields = nil
|
62
47
|
@pt = nil
|
63
48
|
end
|
64
|
-
|
65
|
-
alias :set_up :setup
|
66
|
-
alias :tear_down :teardown
|
67
49
|
end
|
data/test/tc_kvm_bsd.rb
CHANGED
@@ -3,20 +3,6 @@
|
|
3
3
|
#
|
4
4
|
# Test suite for the BSD specific version of the kvm interface.
|
5
5
|
################################################################
|
6
|
-
base = File.basename(Dir.pwd)
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
require 'fileutils'
|
10
|
-
require 'rbconfig'
|
11
|
-
|
12
|
-
Dir.chdir '..' if base == 'test'
|
13
|
-
file = 'ext/proctable.' + Config::CONFIG['DLEXT']
|
14
|
-
Dir.mkdir('sys') unless File.exists?('sys')
|
15
|
-
FileUtils.cp(file, 'sys')
|
16
|
-
|
17
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
18
|
-
end
|
19
|
-
|
20
6
|
require "test/unit"
|
21
7
|
require "sys/proctable"
|
22
8
|
include Sys
|
data/test/tc_linux.rb
CHANGED
@@ -3,20 +3,8 @@
|
|
3
3
|
#
|
4
4
|
# Test suite for sys-proctable for Linux.
|
5
5
|
##########################################
|
6
|
-
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
require 'fileutils'
|
10
|
-
require 'rbconfig'
|
11
|
-
|
12
|
-
Dir.chdir('..') if base == 'test'
|
13
|
-
file = 'ext/proctable.' + Config::CONFIG['DLEXT']
|
14
|
-
Dir.mkdir('sys') unless File.exists?('sys')
|
15
|
-
FileUtils.cp(file, 'sys')
|
16
|
-
|
17
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
18
|
-
end
|
19
|
-
|
6
|
+
require "sys/proctable"
|
7
|
+
require "test/unit"
|
20
8
|
require "test/tc_all"
|
21
9
|
|
22
10
|
class TC_ProcTable_Linux < Test::Unit::TestCase
|
@@ -54,8 +42,4 @@ class TC_ProcTable_Linux < Test::Unit::TestCase
|
|
54
42
|
def teardown
|
55
43
|
@pt = nil
|
56
44
|
end
|
57
|
-
|
58
|
-
alias :set_up :setup
|
59
|
-
alias :tear_down :teardown
|
60
|
-
|
61
45
|
end
|
data/test/tc_sunos.rb
CHANGED
@@ -3,20 +3,6 @@
|
|
3
3
|
#
|
4
4
|
# Test suite for sys-proctable for SunOS/Solaris.
|
5
5
|
##################################################
|
6
|
-
base = File.basename(Dir.pwd)
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
require 'fileutils'
|
10
|
-
require 'rbconfig'
|
11
|
-
|
12
|
-
Dir.chdir '..' if base == 'test'
|
13
|
-
file = 'ext/proctable.' + Config::CONFIG['DLEXT']
|
14
|
-
Dir.mkdir('sys') unless File.exists?('sys')
|
15
|
-
FileUtils.cp(file, 'sys')
|
16
|
-
|
17
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
18
|
-
end
|
19
|
-
|
20
6
|
require "sys/proctable"
|
21
7
|
require "test/unit"
|
22
8
|
require "test/tc_all"
|
@@ -63,7 +49,4 @@ class TC_ProcTable_SunOS < Test::Unit::TestCase
|
|
63
49
|
@pt = nil
|
64
50
|
@fields = nil
|
65
51
|
end
|
66
|
-
|
67
|
-
alias :set_up :setup
|
68
|
-
alias :tear_down :teardown
|
69
52
|
end
|
data/test/tc_top.rb
CHANGED
@@ -3,14 +3,6 @@
|
|
3
3
|
#
|
4
4
|
# Test suite for the sys-top package that is included with this distribution.
|
5
5
|
##############################################################################
|
6
|
-
base = File.basename(Dir.pwd)
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
Dir.chdir('..') if base == 'test'
|
10
|
-
$LOAD_PATH.unshift(Dir.pwd)
|
11
|
-
$LOAD_PATH.unshift(Dir.pwd + '/lib')
|
12
|
-
end
|
13
|
-
|
14
6
|
require 'test/unit'
|
15
7
|
require 'sys/top'
|
16
8
|
include Sys
|
data/test/tc_windows.rb
CHANGED
@@ -3,18 +3,9 @@
|
|
3
3
|
#
|
4
4
|
# Test suite for sys-proctable for MS Windows
|
5
5
|
##################################################
|
6
|
-
base = File.basename(Dir.pwd)
|
7
|
-
|
8
|
-
if base == 'test' || base =~ /sys-proctable.*/
|
9
|
-
Dir.chdir('..') if base == 'test'
|
10
|
-
File.rename("lib/sys/windows.rb", "lib/sys/proctable.rb")
|
11
|
-
$LOAD_PATH.unshift(Dir.pwd + '/lib')
|
12
|
-
end
|
13
|
-
|
14
6
|
require 'sys/proctable'
|
15
7
|
require 'test/unit'
|
16
8
|
require 'test/tc_all'
|
17
|
-
include Sys
|
18
9
|
|
19
10
|
class TC_ProcTable_MSWindows < Test::Unit::TestCase
|
20
11
|
def setup
|