proc-wait3 1.8.1 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/{CHANGES.rdoc → CHANGES.md} +33 -23
- data/Gemfile +2 -0
- data/{MANIFEST.rdoc → MANIFEST.md} +5 -4
- data/{README.rdoc → README.md} +28 -22
- data/Rakefile +16 -16
- data/doc/wait3.md +225 -0
- data/examples/example_pause.rb +1 -1
- data/ext/extconf.rb +2 -15
- data/ext/proc/wait3.c +46 -39
- data/proc-wait3.gemspec +10 -12
- data/spec/proc_wait3_spec.rb +242 -0
- data.tar.gz.sig +0 -0
- metadata +27 -36
- metadata.gz.sig +0 -0
- data/doc/wait3.txt +0 -192
- data/test/test_proc_wait3.rb +0 -227
data/doc/wait3.txt
DELETED
@@ -1,192 +0,0 @@
|
|
1
|
-
== Description
|
2
|
-
Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to
|
3
|
-
the Process module.
|
4
|
-
|
5
|
-
== Synopsis
|
6
|
-
require 'proc/wait3'
|
7
|
-
|
8
|
-
pid = fork{ sleep 1; exit 2 }
|
9
|
-
p Time.now
|
10
|
-
Process.wait3
|
11
|
-
p $?
|
12
|
-
|
13
|
-
== Module Methods
|
14
|
-
Proc.pause(signals=nil)
|
15
|
-
Pauses the current process. If the process receives any of the signals
|
16
|
-
you pass as arguments it will return from the pause and continue with
|
17
|
-
the execution of your code. Otherwise, it will exit.
|
18
|
-
|
19
|
-
Note that you must leave out the 'SIG' prefix for the signal name, e.g.
|
20
|
-
use 'INT', not 'SIGINT'.
|
21
|
-
|
22
|
-
Returns the result of the pause() function, which should always be -1.
|
23
|
-
|
24
|
-
Process.sigsend(idtype, id, signal=0)
|
25
|
-
Sends a signal of type "idtype" to a process or process group "id". This
|
26
|
-
is more versatile method of sending signals to processes than Process.kill.
|
27
|
-
|
28
|
-
For a list of valid idtype values, see the "Process type constants" below.
|
29
|
-
Not supported on all platforms.
|
30
|
-
|
31
|
-
Proc.wait3(flags=0)
|
32
|
-
Delays its caller until a signal is received or one of its child processes
|
33
|
-
terminates or stops due to tracing.
|
34
|
-
|
35
|
-
The return value is a ProcStat structure and sets the $last_status global
|
36
|
-
variable. The special global $? is also set. Raises a SystemError if there
|
37
|
-
are no child processes.
|
38
|
-
|
39
|
-
Proc.wait4(pid, flags=0)
|
40
|
-
Waits for the given child process to exit. Returns a ProcStat structure.
|
41
|
-
The $last_status global variable is set. Also sets the $? special global
|
42
|
-
variable.
|
43
|
-
|
44
|
-
Proc.waitid(id_type, id_num=nil, options=nil)
|
45
|
-
Suspends the calling process until one of its children changes state,
|
46
|
-
returning immediately if a child process changed state prior to the call.
|
47
|
-
The state of a child process will change if it terminates, stops because
|
48
|
-
of a signal, becomes trapped or reaches a breakpoint.
|
49
|
-
|
50
|
-
The id_num corresponds to a process ID or process group ID, depending on
|
51
|
-
the value of +id_type+, which may be Process::P_PID, Process::P_PGID or
|
52
|
-
Process::P_ALL. If +id_type+ is Process::P_ALL, then the +id_num+ is ignored.
|
53
|
-
|
54
|
-
The options argument is used to specify which state changes are to be
|
55
|
-
waited for. It is constructed from the bitwise-OR of one or more of the
|
56
|
-
following constants:
|
57
|
-
|
58
|
-
Process::WCONTINUED
|
59
|
-
Process::WEXITED
|
60
|
-
Process::WNOHANG
|
61
|
-
Process::WNOWAIT
|
62
|
-
Process::WSTOPPED
|
63
|
-
Process::WTRAPPED (not supported on all platforms)
|
64
|
-
|
65
|
-
If Process::WNOHANG is set as an option, this method will return
|
66
|
-
immediately, whether or not a child has changed state.
|
67
|
-
|
68
|
-
Calling this method with an +id_type+ of Process::P_ALL and the options set
|
69
|
-
to 'Process::EXITED | Process::WTRAPPED' is equivalent to calling
|
70
|
-
Process.wait.
|
71
|
-
|
72
|
-
Returns a Proc::SigInfo struct and sets $?.
|
73
|
-
|
74
|
-
Not supported on all platforms.
|
75
|
-
|
76
|
-
== Constants
|
77
|
-
=== Standard
|
78
|
-
Process::WAIT3_VERSION
|
79
|
-
Returns the version of this package as a string.
|
80
|
-
|
81
|
-
=== Process type constants
|
82
|
-
==== All platforms
|
83
|
-
Process::P_ALL
|
84
|
-
All non-system process.
|
85
|
-
|
86
|
-
Process::P_PID
|
87
|
-
A standard process id.
|
88
|
-
|
89
|
-
Process::P_PGID
|
90
|
-
Any non-system process group id.
|
91
|
-
|
92
|
-
==== Not supported on all platforms
|
93
|
-
Process::P_CID
|
94
|
-
A scheduler process id.
|
95
|
-
|
96
|
-
Process::P_GID
|
97
|
-
Any non-system effective process group id.
|
98
|
-
|
99
|
-
Process::P_PROJID
|
100
|
-
A project process id. Solaris 8 or later only.
|
101
|
-
|
102
|
-
Process::P_SID
|
103
|
-
A session process id.
|
104
|
-
|
105
|
-
Process::P_TASKID
|
106
|
-
A task process id. Solaris 8 or later only.
|
107
|
-
|
108
|
-
Process::P_UID
|
109
|
-
Any non-system effective process user id.
|
110
|
-
|
111
|
-
=== The following additional constants are defined if the waitid function is
|
112
|
-
supported on your system.
|
113
|
-
|
114
|
-
Process::WCONTINUED
|
115
|
-
Return the status for any child that was stopped and has been continued.
|
116
|
-
|
117
|
-
Process::WEXITED
|
118
|
-
Wait for process(es) to exit.
|
119
|
-
|
120
|
-
Process::WNOWAIT
|
121
|
-
Keep the process in a waitable state.
|
122
|
-
|
123
|
-
Process::WSTOPPED
|
124
|
-
Wait for and return the process status of any child that has stopped upon
|
125
|
-
receipt of a signal.
|
126
|
-
|
127
|
-
Process::WTRAPPED
|
128
|
-
Wait for traced process(es) to become trapped or reach a breakpoint.
|
129
|
-
|
130
|
-
Not supported on all platforms.
|
131
|
-
|
132
|
-
=== RLIMIT constants
|
133
|
-
Process::RLIMIT_AS
|
134
|
-
A synonym for RLIMIT_VMEM
|
135
|
-
|
136
|
-
Process::RLIMIT_CORE
|
137
|
-
The maximum size of a core file, in bytes, that may be created.
|
138
|
-
|
139
|
-
Process::RLIMIT_CPU
|
140
|
-
The maximum amount of CPU time, in seconds, the process is allowed to use.
|
141
|
-
|
142
|
-
Process::RLIMIT_DATA
|
143
|
-
The maximum size of the process' heap size, in bytes.
|
144
|
-
|
145
|
-
Process::RLIMIT_FSIZE
|
146
|
-
The maximum size of a file, in bytes, that the process may create.
|
147
|
-
|
148
|
-
Process::RLIMIT_NOFILE
|
149
|
-
The maximum value that the kernel may assign to a file descriptor,
|
150
|
-
effectively limiting the number of open files for the calling process.
|
151
|
-
|
152
|
-
Process::RLIMIT_STACK
|
153
|
-
The maximum size of the process' stack in bytes.
|
154
|
-
|
155
|
-
Process::RLIMIT_VMEM
|
156
|
-
The maximum size of the process' mapped address space.
|
157
|
-
|
158
|
-
Process::RLIM_INFINITY
|
159
|
-
A infinite limit.
|
160
|
-
|
161
|
-
Process::RLIM_SAVED_CUR
|
162
|
-
Current soft limit.
|
163
|
-
|
164
|
-
Process::RLIM_SAVED_MAX
|
165
|
-
Current hard limit.
|
166
|
-
|
167
|
-
== Notes
|
168
|
-
The wait3 and wait4 methods are similar to the wait2 and waitpid2
|
169
|
-
methods, except that they return much more information via the rusage
|
170
|
-
struct.
|
171
|
-
|
172
|
-
== Known Bugs
|
173
|
-
None that I'm aware of. Please log any bugs on the Github project
|
174
|
-
page at https://github.com/djberg96/proc-wait3.
|
175
|
-
|
176
|
-
== License
|
177
|
-
Apache-2.0
|
178
|
-
|
179
|
-
== Copyright
|
180
|
-
(C) 2003-2019 Daniel J. Berger
|
181
|
-
All Rights Reserved.
|
182
|
-
|
183
|
-
== Warranty
|
184
|
-
This package is provided "as is" and without any express or
|
185
|
-
implied warranties, including, without limitation, the implied
|
186
|
-
warranties of merchantability and fitness for a particular purpose.
|
187
|
-
|
188
|
-
== Author
|
189
|
-
Daniel J. Berger
|
190
|
-
|
191
|
-
== See also
|
192
|
-
wait3, wait4, waitid, pause, sigsend
|
data/test/test_proc_wait3.rb
DELETED
@@ -1,227 +0,0 @@
|
|
1
|
-
##################################################################
|
2
|
-
# test_proc_wait3.rb
|
3
|
-
#
|
4
|
-
# Test suite for the Ruby proc-wait3 package. You should run this
|
5
|
-
# via the 'test' rake task.
|
6
|
-
##################################################################
|
7
|
-
require 'proc/wait3'
|
8
|
-
require 'test-unit'
|
9
|
-
require 'rbconfig'
|
10
|
-
|
11
|
-
class TC_Proc_Wait3 < Test::Unit::TestCase
|
12
|
-
def self.startup
|
13
|
-
@@solaris = RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i
|
14
|
-
@@darwin = RbConfig::CONFIG['host_os'] =~ /darwin|osx/i
|
15
|
-
@@hpux = RbConfig::CONFIG['host_os'] =~ /hpux/i
|
16
|
-
@@linux = RbConfig::CONFIG['host_os'] =~ /linux/i
|
17
|
-
@@freebsd = RbConfig::CONFIG['host_os'] =~ /bsd/i
|
18
|
-
end
|
19
|
-
|
20
|
-
def setup
|
21
|
-
@proc_stat = nil
|
22
|
-
@proc_stat_members = [
|
23
|
-
"pid", "status", "utime", "stime", "maxrss",
|
24
|
-
"ixrss", "idrss", "isrss", "minflt", "majflt", "nswap", "inblock",
|
25
|
-
"oublock", "msgsnd", "msgrcv", "nsignals", "nvcsw", "nivcsw",
|
26
|
-
"stopped", "signaled","exited","success","coredump","exitstatus",
|
27
|
-
"termsig", "stopsig"
|
28
|
-
]
|
29
|
-
|
30
|
-
@proc_stat_members = @proc_stat_members.map{ |e| e.to_sym }
|
31
|
-
end
|
32
|
-
|
33
|
-
test "version constant is set to expected value" do
|
34
|
-
assert_equal('1.8.1', Process::WAIT3_VERSION)
|
35
|
-
assert_true(Process::WAIT3_VERSION.frozen?)
|
36
|
-
end
|
37
|
-
|
38
|
-
test "wait3 method is defined" do
|
39
|
-
assert_respond_to(Process, :wait3)
|
40
|
-
end
|
41
|
-
|
42
|
-
test "wait3 works as expected" do
|
43
|
-
fork{ sleep 0.5 }
|
44
|
-
assert_nothing_raised{ Process.wait3 }
|
45
|
-
end
|
46
|
-
|
47
|
-
test "wait3 returns the expected proc status membes" do
|
48
|
-
fork{ sleep 0.5 }
|
49
|
-
assert_nothing_raised{ @proc_stat = Process.wait3 }
|
50
|
-
assert_equal(@proc_stat_members, @proc_stat.members)
|
51
|
-
end
|
52
|
-
|
53
|
-
test "wait3 with WNOHANG works as expected" do
|
54
|
-
fork{ sleep 0.5 }
|
55
|
-
assert_nothing_raised{ Process.wait3(Process::WNOHANG) }
|
56
|
-
end
|
57
|
-
|
58
|
-
test "wait3 sets and returns $last_status to expected values" do
|
59
|
-
fork{ sleep 0.5 }
|
60
|
-
Process.wait3
|
61
|
-
assert_kind_of(Struct::ProcStat, $last_status)
|
62
|
-
assert_not_nil($last_status)
|
63
|
-
end
|
64
|
-
|
65
|
-
test "wait3 sets pid and status members of $?" do
|
66
|
-
fork{ sleep 0.5 }
|
67
|
-
Process.wait3
|
68
|
-
assert_not_nil($?)
|
69
|
-
end
|
70
|
-
|
71
|
-
test "wait3 returns frozen struct" do
|
72
|
-
fork{ sleep 0.5 }
|
73
|
-
struct = Process.wait3
|
74
|
-
assert_true(struct.frozen?)
|
75
|
-
end
|
76
|
-
|
77
|
-
test "getdtablesize works as expected" do
|
78
|
-
omit_unless(@@solaris, 'getdtablesize skipped on this platform')
|
79
|
-
|
80
|
-
assert_respond_to(Process, :getdtablesize)
|
81
|
-
assert_kind_of(Fixnum, Process.getdtablesize)
|
82
|
-
assert(Process.getdtablesize > 0)
|
83
|
-
end
|
84
|
-
|
85
|
-
test "wait4 method is defined" do
|
86
|
-
omit_if(@@hpux, 'wait4 test skipped on this platform')
|
87
|
-
assert_respond_to(Process,:wait4)
|
88
|
-
end
|
89
|
-
|
90
|
-
test "wait4 requires at least one argument" do
|
91
|
-
assert_raises(ArgumentError){ Process.wait4 }
|
92
|
-
end
|
93
|
-
|
94
|
-
test "wait4 works as expected" do
|
95
|
-
omit_if(@@hpux, 'wait4 test skipped on this platform')
|
96
|
-
|
97
|
-
pid = fork{ sleep 0.5 }
|
98
|
-
assert_nothing_raised{ @proc_stat = Process.wait4(pid) }
|
99
|
-
assert_kind_of(Struct::ProcStat, @proc_stat)
|
100
|
-
end
|
101
|
-
|
102
|
-
test "wait4 sets and returns $last_status to expected values" do
|
103
|
-
pid = fork{ sleep 0.5 }
|
104
|
-
Process.wait4(pid)
|
105
|
-
assert_kind_of(Struct::ProcStat, $last_status)
|
106
|
-
assert_not_nil($last_status)
|
107
|
-
end
|
108
|
-
|
109
|
-
test "wait4 sets pid and status members of $?" do
|
110
|
-
pid = fork{ sleep 0.5 }
|
111
|
-
Process.wait4(pid)
|
112
|
-
assert_not_nil($?)
|
113
|
-
end
|
114
|
-
|
115
|
-
test "wait4 returns frozen struct" do
|
116
|
-
pid = fork{ sleep 0.5 }
|
117
|
-
struct = Process.wait4(pid)
|
118
|
-
assert_true(struct.frozen?)
|
119
|
-
end
|
120
|
-
|
121
|
-
test "waitid method is defined" do
|
122
|
-
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
123
|
-
assert_respond_to(Process, :waitid)
|
124
|
-
end
|
125
|
-
|
126
|
-
test "waitid method works as expected" do
|
127
|
-
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
128
|
-
pid = fork{ sleep 0.5 }
|
129
|
-
assert_nothing_raised{ Process.waitid(Process::P_PID, pid, Process::WEXITED) }
|
130
|
-
end
|
131
|
-
|
132
|
-
test "waitid method raises expected errors if wrong argument type is passed" do
|
133
|
-
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
134
|
-
pid = fork{ sleep 0.5 }
|
135
|
-
assert_raises(TypeError){ Process.waitid("foo", pid, Process::WEXITED) }
|
136
|
-
assert_raises(TypeError){ Process.waitid(Process::P_PID, pid, "foo") }
|
137
|
-
assert_raises(TypeError){ Process.waitid(Process::P_PID, "foo", Process::WEXITED) }
|
138
|
-
end
|
139
|
-
|
140
|
-
test "waitid method raises expected error if invalid argument is passed" do
|
141
|
-
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
142
|
-
fork{ sleep 0.5 }
|
143
|
-
assert_raises(Errno::ECHILD, Errno::EINVAL){ Process.waitid(Process::P_PID, 99999999, Process::WEXITED) }
|
144
|
-
end
|
145
|
-
|
146
|
-
test "sigsend method is defined" do
|
147
|
-
omit_unless(@@solaris, 'sigsend test skipped on this platform')
|
148
|
-
assert_respond_to(Process, :sigsend)
|
149
|
-
end
|
150
|
-
|
151
|
-
test "sigsend works as expected" do
|
152
|
-
omit_unless(@@solaris, 'sigsend test skipped on this platform')
|
153
|
-
pid = fork{ sleep 0.5 }
|
154
|
-
assert_nothing_raised{ Process.sigsend(Process::P_PID, pid, 0) }
|
155
|
-
end
|
156
|
-
|
157
|
-
test "getrusage method is defined" do
|
158
|
-
assert_respond_to(Process, :getrusage)
|
159
|
-
end
|
160
|
-
|
161
|
-
test "getrusage works as expected" do
|
162
|
-
fork{ sleep 0.5 }
|
163
|
-
assert_nothing_raised{ Process.getrusage }
|
164
|
-
assert_nothing_raised{ Process.getrusage(true) }
|
165
|
-
end
|
166
|
-
|
167
|
-
test "getrusage can get thread info on Linux" do
|
168
|
-
omit_unless(@@linux)
|
169
|
-
assert_nothing_raised{ Process.getrusage(Process::RUSAGE_THREAD) }
|
170
|
-
end
|
171
|
-
|
172
|
-
test "getrusage returns the expected struct" do
|
173
|
-
fork{ sleep 0.5 }
|
174
|
-
assert_kind_of(Struct::RUsage, Process.getrusage)
|
175
|
-
assert_kind_of(Float, Process.getrusage.stime)
|
176
|
-
assert_kind_of(Float, Process.getrusage.utime)
|
177
|
-
end
|
178
|
-
|
179
|
-
test "pause method is defined" do
|
180
|
-
assert_respond_to(Process, :pause)
|
181
|
-
end
|
182
|
-
|
183
|
-
test "expected constants are defined" do
|
184
|
-
omit_if(@@darwin || @@freebsd, 'wait constant check skipped on this platform')
|
185
|
-
|
186
|
-
assert_not_nil(Process::WCONTINUED)
|
187
|
-
assert_not_nil(Process::WEXITED)
|
188
|
-
assert_not_nil(Process::WNOWAIT)
|
189
|
-
assert_not_nil(Process::WSTOPPED)
|
190
|
-
|
191
|
-
omit_if(@@linux, 'WTRAPPED constant check skipped on this platform')
|
192
|
-
assert_not_nil(Process::WTRAPPED)
|
193
|
-
end
|
194
|
-
|
195
|
-
test "expected process type flag constants are defined" do
|
196
|
-
omit_if(@@linux || @@darwin || @@freebsd, 'process type flag check skipped on this platform')
|
197
|
-
|
198
|
-
assert_not_nil(Process::P_ALL)
|
199
|
-
assert_not_nil(Process::P_CID)
|
200
|
-
assert_not_nil(Process::P_GID)
|
201
|
-
assert_not_nil(Process::P_MYID) unless @@solaris
|
202
|
-
assert_not_nil(Process::P_PGID)
|
203
|
-
assert_not_nil(Process::P_PID)
|
204
|
-
assert_not_nil(Process::P_SID)
|
205
|
-
assert_not_nil(Process::P_UID)
|
206
|
-
end
|
207
|
-
|
208
|
-
test "solaris-specific process type flags are defined on solaris" do
|
209
|
-
omit_unless(@@solaris, 'P_TASKID and P_PROJID constant check skipped on this platform')
|
210
|
-
|
211
|
-
assert_not_nil(Process::P_TASKID)
|
212
|
-
assert_not_nil(Process::P_PROJID)
|
213
|
-
end
|
214
|
-
|
215
|
-
def teardown
|
216
|
-
@proc_stat = nil
|
217
|
-
@proc_stat_members = nil
|
218
|
-
end
|
219
|
-
|
220
|
-
def self.shutdown
|
221
|
-
@@solaris = nil
|
222
|
-
@@darwin = nil
|
223
|
-
@@hpux = nil
|
224
|
-
@@linux = nil
|
225
|
-
@@freebsd = nil
|
226
|
-
end
|
227
|
-
end
|