proc-wait3 1.9.0 → 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 +5 -8
- data/CHANGES.md +4 -0
- data/Gemfile +2 -7
- data/MANIFEST.md +1 -1
- data/README.md +6 -4
- data/Rakefile +1 -1
- data/doc/wait3.md +225 -0
- data/examples/example_pause.rb +1 -1
- data/ext/extconf.rb +2 -15
- data/ext/proc/wait3.c +45 -38
- data/proc-wait3.gemspec +8 -7
- data/spec/proc_wait3_spec.rb +40 -32
- data.tar.gz.sig +0 -0
- metadata +6 -5
- metadata.gz.sig +2 -2
- data/doc/wait3.txt +0 -192
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2054430d4049b9aa27f1902f704220818bf4e6b8d7d19e428e10e3ed736d6c9
|
4
|
+
data.tar.gz: 9be23be7ddad009649f5ec83692102b05334a9013d99a68f1643c1c2eda37b62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6f95da3b81622fd0a4ca7be57f787ec63201be854f28bcb023aec9af3360ef8ec6af228ca3c180dfa7163831456aa57fd68ced837cb40d46f3b262e2a2b4554
|
7
|
+
data.tar.gz: fff3abd919e4c0f07ab666ea3f3a1db8d514fa63802fd408b57c87f0c8208d6cf4e886813605156625bc00e8b931405098e5a714d34a91a00830287974603507
|
checksums.yaml.gz.sig
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
-
�
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
�
|
6
|
-
8�
|
7
|
-
K!
|
8
|
-
�9��a#q(p�Š�v�B]ڭ�N Ѡ]��_7f�汵��X�땍
|
1
|
+
����M�]
|
2
|
+
{�)��N���Xy��*\��'D.˲�g��� >BpX`�/�u���G�F'
|
3
|
+
�R�Ѐ�gG��*%.�.{Z�:�eH\vC�R�� ZE��!��|�x��#�X����7�}e����VzT_�H���N.Z�#ڴ��%IZ �[�<C��,Ca����Ì1��`�CU�ݻ0�ٶ"iO�6���!��T�*��R��6g!����r��!�S���^-aZhRCv��Y�OW�k��&
|
4
|
+
?��8�lz��������82�&5Q�_�j���l��A����!e � W�&%�F<1��)D��&��k0�Y�f���25�<�(��m����=�6�]���E
|
5
|
+
�TT���b&�)
|
data/CHANGES.md
CHANGED
data/Gemfile
CHANGED
data/MANIFEST.md
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
[](https://github.com/djberg96/proc-wait3/actions/workflows/ruby.yml)
|
2
|
+
|
1
3
|
## Description
|
2
4
|
Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to the Process module.
|
3
5
|
|
@@ -32,9 +34,9 @@ Linux users may also notice warnings about implicit declarations. These
|
|
32
34
|
are also harmless, and can be silenced by installing the libbsd-dev package
|
33
35
|
first.
|
34
36
|
|
35
|
-
|
36
|
-
the WNOHANG flag
|
37
|
-
|
37
|
+
These methods may fail in conjunction with `fork` with `Errno::EINTR` unless
|
38
|
+
you pass the WNOHANG flag, or explicitly ignore the `SIGCHLD` signal. Ruby's
|
39
|
+
own `wait` methods appear to essentially be doing that behind the scenes.
|
38
40
|
|
39
41
|
## Integration with Ruby's process.c
|
40
42
|
I considered simply providing a patch to the core process.c file, but I
|
@@ -50,4 +52,4 @@ trouble of typing the word "status", since all they're for is comparing or
|
|
50
52
|
operating on the status attribute.
|
51
53
|
|
52
54
|
## Additional Documentation
|
53
|
-
Please see the doc/wait3.
|
55
|
+
Please see the doc/wait3.md file for detailed documentation.
|
data/Rakefile
CHANGED
@@ -30,7 +30,7 @@ namespace :gem do
|
|
30
30
|
desc "Create the proc-wait3 gem"
|
31
31
|
task :create => [:clean] do
|
32
32
|
require 'rubygems/package'
|
33
|
-
spec =
|
33
|
+
spec = Gem::Specification.load('proc-wait3.gemspec')
|
34
34
|
spec.signing_key = File.join(Dir.home, '.ssh', 'gem-private_key.pem')
|
35
35
|
Gem::Package.build(spec)
|
36
36
|
end
|
data/doc/wait3.md
ADDED
@@ -0,0 +1,225 @@
|
|
1
|
+
## Description
|
2
|
+
Adds the `wait3`, `wait4`, `waitid`, `pause`, `sigsend`, and `getrusage`
|
3
|
+
methods to the Process module.
|
4
|
+
|
5
|
+
## Synopsis
|
6
|
+
```ruby
|
7
|
+
require 'proc/wait3'
|
8
|
+
|
9
|
+
pid = fork{ sleep 1; exit 2 }
|
10
|
+
p Time.now
|
11
|
+
Process.wait3
|
12
|
+
p $?
|
13
|
+
```
|
14
|
+
|
15
|
+
## Module Methods
|
16
|
+
### `Process.pause(signals=nil)`
|
17
|
+
|
18
|
+
Pauses the current process. If the process receives any of the signals
|
19
|
+
you pass as arguments it will return from the pause and continue with
|
20
|
+
the execution of your code. Otherwise, it will exit.
|
21
|
+
|
22
|
+
Note that you must leave out the 'SIG' prefix for the signal name, e.g.
|
23
|
+
use 'INT', not 'SIGINT'.
|
24
|
+
|
25
|
+
Returns the result of the underlying `pause()` function, which should always be -1.
|
26
|
+
|
27
|
+
### `Process.sigsend(idtype, id, signal=0)`
|
28
|
+
|
29
|
+
Sends a signal of type "idtype" to a process or process group "id". This
|
30
|
+
is more versatile method of sending signals to processes than Process.kill.
|
31
|
+
|
32
|
+
For a list of valid idtype values, see the "Process type constants" below.
|
33
|
+
Not supported on all platforms.
|
34
|
+
|
35
|
+
### `Proc.wait3(flags=0)`
|
36
|
+
|
37
|
+
Delays its caller until a signal is received or one of its child processes
|
38
|
+
terminates or stops due to tracing.
|
39
|
+
|
40
|
+
The return value is a ProcStat structure and sets the `$last_status` global
|
41
|
+
variable. The special global $? is also set. Raises a SystemError if there
|
42
|
+
are no child processes.
|
43
|
+
|
44
|
+
### `Proc.wait4(pid, flags=0)`
|
45
|
+
|
46
|
+
Waits for the given child process to exit. Returns a ProcStat structure.
|
47
|
+
The `$last_status` global variable is set. Also sets the `$?` special global
|
48
|
+
variable.
|
49
|
+
|
50
|
+
### `Proc.waitid(id_type, id_num=nil, options=nil)`
|
51
|
+
|
52
|
+
Suspends the calling process until one of its children changes state,
|
53
|
+
returning immediately if a child process changed state prior to the call.
|
54
|
+
The state of a child process will change if it terminates, stops because
|
55
|
+
of a signal, becomes trapped or reaches a breakpoint.
|
56
|
+
|
57
|
+
The `id_num` corresponds to a process ID or process group ID, depending on
|
58
|
+
the value of `id_type`, which may be `Process::P_PID`, `Process::P_PGID` or
|
59
|
+
`Process::P_ALL`. If `id_type` is `Process::P_ALL`, then the `id_num` is ignored.
|
60
|
+
|
61
|
+
The options argument is used to specify which state changes are to be
|
62
|
+
waited for. It is constructed from the bitwise-OR of one or more of the
|
63
|
+
following constants:
|
64
|
+
|
65
|
+
* Process::WCONTINUED
|
66
|
+
* Process::WEXITED
|
67
|
+
* Process::WNOHANG
|
68
|
+
* Process::WNOWAIT
|
69
|
+
* Process::WSTOPPED
|
70
|
+
* Process::WTRAPPED (not supported on all platforms)
|
71
|
+
|
72
|
+
If `Process::WNOHANG` is set as an option, this method will return
|
73
|
+
immediately, whether or not a child has changed state.
|
74
|
+
|
75
|
+
Calling this method with an `id_type` of `Process::P_ALL` and the options set
|
76
|
+
to `Process::EXITED | Process::WTRAPPED` is equivalent to calling
|
77
|
+
Process.wait.
|
78
|
+
|
79
|
+
Returns a `Proc::SigInfo` struct and sets `$?`.
|
80
|
+
|
81
|
+
Not supported on all platforms.
|
82
|
+
|
83
|
+
## Standard Constants
|
84
|
+
`Process::WAIT3_VERSION`
|
85
|
+
|
86
|
+
Returns the version of this package as a string.
|
87
|
+
|
88
|
+
## Process type constants - all platforms
|
89
|
+
`Process::P_ALL`
|
90
|
+
|
91
|
+
All non-system process.
|
92
|
+
|
93
|
+
`Process::P_PID`
|
94
|
+
|
95
|
+
A standard process id.
|
96
|
+
|
97
|
+
`Process::P_PGID`
|
98
|
+
|
99
|
+
Any non-system process group id.
|
100
|
+
|
101
|
+
## Process type constants - not all platforms supported
|
102
|
+
`Process::P_CID`
|
103
|
+
|
104
|
+
A scheduler process id.
|
105
|
+
|
106
|
+
`Process::P_GID`
|
107
|
+
|
108
|
+
Any non-system effective process group id.
|
109
|
+
|
110
|
+
`Process::P_PROJID`
|
111
|
+
|
112
|
+
A project process id. Solaris 8 or later only.
|
113
|
+
|
114
|
+
`Process::P_SID`
|
115
|
+
|
116
|
+
A session process id.
|
117
|
+
|
118
|
+
`Process::P_TASKID`
|
119
|
+
|
120
|
+
A task process id. Solaris 8 or later only.
|
121
|
+
|
122
|
+
`Process::P_UID`
|
123
|
+
|
124
|
+
Any non-system effective process user id.
|
125
|
+
|
126
|
+
## Additional Process constants - defined if waitid is defined on your system
|
127
|
+
`Process::WCONTINUED`
|
128
|
+
|
129
|
+
Return the status for any child that was stopped and has been continued.
|
130
|
+
|
131
|
+
`Process::WEXITED`
|
132
|
+
|
133
|
+
Wait for process(es) to exit.
|
134
|
+
|
135
|
+
`Process::WNOWAIT`
|
136
|
+
|
137
|
+
Keep the process in a waitable state.
|
138
|
+
|
139
|
+
`Process::WSTOPPED`
|
140
|
+
|
141
|
+
Wait for and return the process status of any child that has stopped upon
|
142
|
+
receipt of a signal.
|
143
|
+
|
144
|
+
`Process::WTRAPPED`
|
145
|
+
|
146
|
+
Wait for traced process(es) to become trapped or reach a breakpoint.
|
147
|
+
|
148
|
+
Not supported on all platforms.
|
149
|
+
|
150
|
+
## RLIMIT constants
|
151
|
+
`Process::RLIMIT_AS`
|
152
|
+
|
153
|
+
A synonym for `RLIMIT_VMEM`.
|
154
|
+
|
155
|
+
`Process::RLIMIT_CORE`
|
156
|
+
|
157
|
+
The maximum size of a core file, in bytes, that may be created.
|
158
|
+
|
159
|
+
`Process::RLIMIT_CPU`
|
160
|
+
|
161
|
+
The maximum amount of CPU time, in seconds, the process is allowed to use.
|
162
|
+
|
163
|
+
`Process::RLIMIT_DATA`
|
164
|
+
|
165
|
+
The maximum size of the process' heap size, in bytes.
|
166
|
+
|
167
|
+
`Process::RLIMIT_FSIZE`
|
168
|
+
|
169
|
+
The maximum size of a file, in bytes, that the process may create.
|
170
|
+
|
171
|
+
`Process::RLIMIT_NOFILE`
|
172
|
+
|
173
|
+
The maximum value that the kernel may assign to a file descriptor,
|
174
|
+
effectively limiting the number of open files for the calling process.
|
175
|
+
|
176
|
+
`Process::RLIMIT_STACK`
|
177
|
+
|
178
|
+
The maximum size of the process' stack in bytes.
|
179
|
+
|
180
|
+
`Process::RLIMIT_VMEM`
|
181
|
+
|
182
|
+
The maximum size of the process' mapped address space.
|
183
|
+
|
184
|
+
`Process::RLIM_INFINITY`
|
185
|
+
|
186
|
+
A infinite limit.
|
187
|
+
|
188
|
+
`Process::RLIM_SAVED_CUR`
|
189
|
+
|
190
|
+
Current soft limit.
|
191
|
+
|
192
|
+
`Process::RLIM_SAVED_MAX`
|
193
|
+
|
194
|
+
Current hard limit.
|
195
|
+
|
196
|
+
## Notes
|
197
|
+
The `wait3` and `wait4` methods are similar to the `wait2` and `waitpid2`
|
198
|
+
methods, except that they return much more information via the rusage
|
199
|
+
struct.
|
200
|
+
|
201
|
+
## Future Plans
|
202
|
+
Wrap the wait6 function, and add better BSD support in general.
|
203
|
+
|
204
|
+
## Known Bugs
|
205
|
+
None that I'm aware of. Please log any bugs on the Github project
|
206
|
+
page at https://github.com/djberg96/proc-wait3.
|
207
|
+
|
208
|
+
## License
|
209
|
+
Apache-2.0
|
210
|
+
|
211
|
+
## Copyright
|
212
|
+
(C) 2003-2024 Daniel J. Berger
|
213
|
+
|
214
|
+
All Rights Reserved.
|
215
|
+
|
216
|
+
## Warranty
|
217
|
+
This package is provided "as is" and without any express or
|
218
|
+
implied warranties, including, without limitation, the implied
|
219
|
+
warranties of merchantability and fitness for a particular purpose.
|
220
|
+
|
221
|
+
## Author
|
222
|
+
Daniel J. Berger
|
223
|
+
|
224
|
+
## See also
|
225
|
+
wait3, wait4, waitid, pause, sigsend
|
data/examples/example_pause.rb
CHANGED
data/ext/extconf.rb
CHANGED
@@ -7,7 +7,7 @@ require 'mkmf'
|
|
7
7
|
dir_config('proc-wait3')
|
8
8
|
|
9
9
|
have_header('wait.h')
|
10
|
-
have_header('sys/resource.h')
|
10
|
+
have_header('sys/resource.h') # apt install libbsd-dev
|
11
11
|
have_header('sys/wait.h')
|
12
12
|
|
13
13
|
# wait3 is mandatory.
|
@@ -53,20 +53,7 @@ have_struct_member('struct siginfo', 'si_stime', 'signal.h')
|
|
53
53
|
|
54
54
|
have_const('P_CID', 'signal.h')
|
55
55
|
have_const('P_GID', 'signal.h')
|
56
|
-
have_const('P_MYID', 'signal.
|
57
|
-
layout(
|
58
|
-
:pw_name, :string,
|
59
|
-
:pw_passwd, :string,
|
60
|
-
:pw_uid, :uint,
|
61
|
-
:pw_gid, :uint,
|
62
|
-
:pw_change, :ulong,
|
63
|
-
:pw_class, :string,
|
64
|
-
:pw_gecos, :string,
|
65
|
-
:pw_dir, :string,
|
66
|
-
:pw_shell, :string,
|
67
|
-
:pw_expire, :ulong
|
68
|
-
)
|
69
|
-
end')
|
56
|
+
have_const('P_MYID', 'signal.h')
|
70
57
|
have_const('P_SID', 'signal.h')
|
71
58
|
have_const('P_UID', 'signal.h')
|
72
59
|
|
data/ext/proc/wait3.c
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
VALUE v_last_status;
|
30
30
|
VALUE v_procstat_struct, v_siginfo_struct, v_usage_struct;
|
31
31
|
|
32
|
-
static void sigproc(int signum);
|
32
|
+
static void sigproc(int signum, siginfo_t* info, void* ucontext);
|
33
33
|
|
34
34
|
/*
|
35
35
|
* Returns true if this process is stopped. This is only returned
|
@@ -163,22 +163,22 @@ static VALUE proc_wait3(int argc, VALUE *argv, VALUE mod){
|
|
163
163
|
v_last_status = rb_struct_new(v_procstat_struct,
|
164
164
|
INT2FIX(pid),
|
165
165
|
INT2FIX(status),
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
166
|
+
rb_float_new((double)r.ru_utime.tv_sec+(double)r.ru_utime.tv_usec/1e6),
|
167
|
+
rb_float_new((double)r.ru_stime.tv_sec+(double)r.ru_stime.tv_usec/1e6),
|
168
|
+
LONG2NUM(r.ru_maxrss),
|
169
|
+
LONG2NUM(r.ru_ixrss),
|
170
|
+
LONG2NUM(r.ru_idrss),
|
171
|
+
LONG2NUM(r.ru_isrss),
|
172
|
+
LONG2NUM(r.ru_minflt),
|
173
|
+
LONG2NUM(r.ru_majflt),
|
174
|
+
LONG2NUM(r.ru_nswap),
|
175
|
+
LONG2NUM(r.ru_inblock),
|
176
|
+
LONG2NUM(r.ru_oublock),
|
177
|
+
LONG2NUM(r.ru_msgsnd),
|
178
|
+
LONG2NUM(r.ru_msgrcv),
|
179
|
+
LONG2NUM(r.ru_nsignals),
|
180
|
+
LONG2NUM(r.ru_nvcsw),
|
181
|
+
LONG2NUM(r.ru_nivcsw),
|
182
182
|
pst_wifstopped(status),
|
183
183
|
pst_wifsignaled(status),
|
184
184
|
pst_wifexited(status),
|
@@ -235,22 +235,22 @@ static VALUE proc_wait4(int argc, VALUE *argv, VALUE mod){
|
|
235
235
|
v_last_status = rb_struct_new(v_procstat_struct,
|
236
236
|
INT2FIX(pid),
|
237
237
|
INT2FIX(status),
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
238
|
+
rb_float_new((double)r.ru_utime.tv_sec+(double)r.ru_utime.tv_usec/1e6),
|
239
|
+
rb_float_new((double)r.ru_stime.tv_sec+(double)r.ru_stime.tv_usec/1e6),
|
240
|
+
LONG2NUM(r.ru_maxrss),
|
241
|
+
LONG2NUM(r.ru_ixrss),
|
242
|
+
LONG2NUM(r.ru_idrss),
|
243
|
+
LONG2NUM(r.ru_isrss),
|
244
|
+
LONG2NUM(r.ru_minflt),
|
245
|
+
LONG2NUM(r.ru_majflt),
|
246
|
+
LONG2NUM(r.ru_nswap),
|
247
|
+
LONG2NUM(r.ru_inblock),
|
248
|
+
LONG2NUM(r.ru_oublock),
|
249
|
+
LONG2NUM(r.ru_msgsnd),
|
250
|
+
LONG2NUM(r.ru_msgrcv),
|
251
|
+
LONG2NUM(r.ru_nsignals),
|
252
|
+
LONG2NUM(r.ru_nvcsw),
|
253
|
+
LONG2NUM(r.ru_nivcsw),
|
254
254
|
pst_wifstopped(status),
|
255
255
|
pst_wifsignaled(status),
|
256
256
|
pst_wifexited(status),
|
@@ -572,7 +572,7 @@ static VALUE proc_waitid(int argc, VALUE* argv, VALUE mod){
|
|
572
572
|
*/
|
573
573
|
static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
|
574
574
|
VALUE v_signals;
|
575
|
-
int i;
|
575
|
+
int i, res;
|
576
576
|
long len;
|
577
577
|
|
578
578
|
rb_scan_args(argc, argv, "0*", &v_signals);
|
@@ -585,6 +585,7 @@ static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
|
|
585
585
|
char signame[SIG2STR_MAX];
|
586
586
|
unsigned int max = SIG2STR_MAX;
|
587
587
|
int signum;
|
588
|
+
struct sigaction act, sa;
|
588
589
|
|
589
590
|
for(i = 0; i < len; i++){
|
590
591
|
v_val = rb_ary_shift(v_signals);
|
@@ -613,7 +614,13 @@ static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
|
|
613
614
|
signum = NUM2INT(v_val);
|
614
615
|
}
|
615
616
|
|
616
|
-
|
617
|
+
memset(&act, 0, sizeof(act));
|
618
|
+
act.sa_flags = SA_SIGINFO;
|
619
|
+
act.sa_sigaction = sigproc;
|
620
|
+
res = sigaction(signum, &act, &sa);
|
621
|
+
|
622
|
+
if(res)
|
623
|
+
rb_sys_fail("sigaction");
|
617
624
|
}
|
618
625
|
}
|
619
626
|
|
@@ -624,7 +631,7 @@ static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
|
|
624
631
|
* This is just a placeholder proc to prevent the "pause" method from exiting
|
625
632
|
* the program if the appropriate signal is intercepted.
|
626
633
|
*/
|
627
|
-
static void sigproc(int signum){ /* Do nothing */ }
|
634
|
+
static void sigproc(int signum, siginfo_t* info, void* ucontext){ /* Do nothing */ }
|
628
635
|
|
629
636
|
#ifdef HAVE_SIGSEND
|
630
637
|
/*
|
@@ -787,7 +794,7 @@ static VALUE proc_getdtablesize(VALUE mod){
|
|
787
794
|
* Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to the
|
788
795
|
* Process module.
|
789
796
|
*/
|
790
|
-
void Init_wait3()
|
797
|
+
void Init_wait3(void)
|
791
798
|
{
|
792
799
|
v_procstat_struct =
|
793
800
|
rb_struct_define("ProcStat","pid","status","utime","stime","maxrss",
|
@@ -955,7 +962,7 @@ void Init_wait3()
|
|
955
962
|
#endif
|
956
963
|
|
957
964
|
/* 1.9.0: The version of the proc-wait3 library */
|
958
|
-
rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_freeze(rb_str_new2("1.9.
|
965
|
+
rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_freeze(rb_str_new2("1.9.1")));
|
959
966
|
|
960
967
|
/* Define this last in our Init_wait3 function */
|
961
968
|
rb_define_readonly_variable("$last_status", &v_last_status);
|
data/proc-wait3.gemspec
CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'proc-wait3'
|
5
|
-
spec.version = '1.9.
|
5
|
+
spec.version = '1.9.1'
|
6
6
|
spec.author = 'Daniel J. Berger'
|
7
7
|
spec.license = 'Apache-2.0'
|
8
8
|
spec.email = 'djberg96@gmail.com'
|
@@ -17,12 +17,13 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.add_development_dependency('rspec', '~> 3.9')
|
18
18
|
|
19
19
|
spec.metadata = {
|
20
|
-
'homepage_uri'
|
21
|
-
'bug_tracker_uri'
|
22
|
-
'changelog_uri'
|
23
|
-
'documentation_uri'
|
24
|
-
'source_code_uri'
|
25
|
-
'wiki_uri'
|
20
|
+
'homepage_uri' => 'https://github.com/djberg96/proc-wait3',
|
21
|
+
'bug_tracker_uri' => 'https://github.com/djberg96/proc-wait3/issues',
|
22
|
+
'changelog_uri' => 'https://github.com/djberg96/proc-wait3/blob/main/CHANGES.md',
|
23
|
+
'documentation_uri' => 'https://github.com/djberg96/proc-wait3/wiki',
|
24
|
+
'source_code_uri' => 'https://github.com/djberg96/proc-wait3',
|
25
|
+
'wiki_uri' => 'https://github.com/djberg96/proc-wait3/wiki',
|
26
|
+
'rubygems_mfa_required' => 'true'
|
26
27
|
}
|
27
28
|
|
28
29
|
spec.description = <<-EOF
|
data/spec/proc_wait3_spec.rb
CHANGED
@@ -9,11 +9,14 @@ require 'rspec'
|
|
9
9
|
require 'rbconfig'
|
10
10
|
|
11
11
|
RSpec.describe Process do
|
12
|
+
# Something in the guts of Ruby was being a pain.
|
13
|
+
Signal.trap('CHLD', 'IGNORE') if RUBY_VERSION.to_f < 3
|
14
|
+
|
12
15
|
let(:solaris) { RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i }
|
13
16
|
let(:darwin) { RbConfig::CONFIG['host_os'] =~ /darwin|osx/i }
|
14
17
|
let(:hpux) { RbConfig::CONFIG['host_os'] =~ /hpux/i }
|
15
18
|
let(:linux) { RbConfig::CONFIG['host_os'] =~ /linux/i }
|
16
|
-
let(:
|
19
|
+
let(:bsd) { RbConfig::CONFIG['host_os'] =~ /bsd|dragonfly/i }
|
17
20
|
|
18
21
|
let(:proc_stat_members) {
|
19
22
|
%i[
|
@@ -25,10 +28,11 @@ RSpec.describe Process do
|
|
25
28
|
|
26
29
|
before do
|
27
30
|
@proc_stat = nil
|
31
|
+
@pid = nil
|
28
32
|
end
|
29
33
|
|
30
34
|
example "version constant is set to expected value" do
|
31
|
-
expect(Process::WAIT3_VERSION).to eq('1.9.
|
35
|
+
expect(Process::WAIT3_VERSION).to eq('1.9.1')
|
32
36
|
expect(Process::WAIT3_VERSION).to be_frozen
|
33
37
|
end
|
34
38
|
|
@@ -38,25 +42,25 @@ RSpec.describe Process do
|
|
38
42
|
|
39
43
|
example "wait3 works as expected" do
|
40
44
|
skip 'wait3 test skipped on this platform' if darwin
|
41
|
-
fork{ sleep 0.5 }
|
45
|
+
@pid = fork{ sleep 0.5 }
|
42
46
|
expect{ Process.wait3 }.not_to raise_error
|
43
47
|
end
|
44
48
|
|
45
49
|
example "wait3 returns the expected proc status members" do
|
46
50
|
skip 'wait3 test skipped on this platform' if darwin
|
47
|
-
fork{ sleep 0.5 }
|
51
|
+
@pid = fork{ sleep 0.5 }
|
48
52
|
expect{ @proc_stat = Process.wait3 }.not_to raise_error
|
49
53
|
expect( @proc_stat.members).to eq(proc_stat_members)
|
50
54
|
end
|
51
55
|
|
52
56
|
example "wait3 with WNOHANG works as expected" do
|
53
|
-
fork{ sleep 0.5 }
|
57
|
+
@pid = fork{ sleep 0.5 }
|
54
58
|
expect{ Process.wait3(Process::WNOHANG) }.not_to raise_error
|
55
59
|
end
|
56
60
|
|
57
61
|
example "wait3 sets and returns $last_status to expected values" do
|
58
62
|
skip 'wait3 test skipped on this platform' if darwin
|
59
|
-
fork{ sleep 0.5 }
|
63
|
+
@pid = fork{ sleep 0.5 }
|
60
64
|
Process.wait3
|
61
65
|
expect($last_status).to be_kind_of(Struct::ProcStat)
|
62
66
|
expect($last_status).not_to be_nil
|
@@ -64,14 +68,14 @@ RSpec.describe Process do
|
|
64
68
|
|
65
69
|
example "wait3 sets pid and status members of $?" do
|
66
70
|
skip 'wait3 test skipped on this platform' if darwin
|
67
|
-
fork{ sleep 0.5 }
|
71
|
+
@pid = fork{ sleep 0.5 }
|
68
72
|
Process.wait3
|
69
73
|
expect($?).not_to be_nil
|
70
74
|
end
|
71
75
|
|
72
76
|
example "wait3 returns frozen struct" do
|
73
77
|
skip 'wait3 test skipped on this platform' if darwin
|
74
|
-
fork{ sleep 0.5 }
|
78
|
+
@pid = fork{ sleep 0.5 }
|
75
79
|
struct = Process.wait3
|
76
80
|
expect(struct).to be_frozen
|
77
81
|
end
|
@@ -97,16 +101,16 @@ RSpec.describe Process do
|
|
97
101
|
example "wait4 works as expected" do
|
98
102
|
skip 'wait4 test skipped on this platform' if hpux || darwin
|
99
103
|
|
100
|
-
pid = fork{ sleep 0.5 }
|
101
|
-
expect{ @proc_stat = Process.wait4(pid) }.not_to raise_error
|
104
|
+
@pid = fork{ sleep 0.5 }
|
105
|
+
expect{ @proc_stat = Process.wait4(@pid) }.not_to raise_error
|
102
106
|
expect(@proc_stat).to be_kind_of(Struct::ProcStat)
|
103
107
|
end
|
104
108
|
|
105
109
|
example "wait4 sets and returns $last_status to expected values" do
|
106
110
|
skip 'wait4 test skipped on this platform' if hpux || darwin
|
107
111
|
|
108
|
-
pid = fork{ sleep 0.5 }
|
109
|
-
Process.wait4(pid)
|
112
|
+
@pid = fork{ sleep 0.5 }
|
113
|
+
Process.wait4(@pid)
|
110
114
|
expect($last_status).to be_kind_of(Struct::ProcStat)
|
111
115
|
expect($last_status).not_to be_nil
|
112
116
|
end
|
@@ -114,45 +118,45 @@ RSpec.describe Process do
|
|
114
118
|
example "wait4 sets pid and status members of $?" do
|
115
119
|
skip 'wait4 test skipped on this platform' if hpux || darwin
|
116
120
|
|
117
|
-
pid = fork{ sleep 0.5 }
|
118
|
-
Process.wait4(pid)
|
121
|
+
@pid = fork{ sleep 0.5 }
|
122
|
+
Process.wait4(@pid)
|
119
123
|
expect($?).not_to be_nil
|
120
124
|
end
|
121
125
|
|
122
126
|
example "wait4 returns frozen struct" do
|
123
127
|
skip 'wait4 test skipped on this platform' if hpux || darwin
|
124
128
|
|
125
|
-
pid = fork{ sleep 0.5 }
|
126
|
-
struct = Process.wait4(pid)
|
129
|
+
@pid = fork{ sleep 0.5 }
|
130
|
+
struct = Process.wait4(@pid)
|
127
131
|
expect(struct).to be_frozen
|
128
132
|
end
|
129
133
|
|
130
134
|
example "waitid method is defined" do
|
131
|
-
skip 'waitid test skipped on this platform' if hpux || darwin ||
|
135
|
+
skip 'waitid test skipped on this platform' if hpux || darwin || bsd
|
132
136
|
|
133
137
|
expect(Process).to respond_to(:waitid)
|
134
138
|
end
|
135
139
|
|
136
140
|
example "waitid method works as expected" do
|
137
|
-
skip 'waitid test skipped on this platform' if hpux || darwin ||
|
141
|
+
skip 'waitid test skipped on this platform' if hpux || darwin || bsd
|
138
142
|
|
139
|
-
pid = fork{ sleep 0.5 }
|
140
|
-
expect{ Process.waitid(Process::P_PID, pid, Process::WEXITED) }.not_to raise_error
|
143
|
+
@pid = fork{ sleep 0.5 }
|
144
|
+
expect{ Process.waitid(Process::P_PID, @pid, Process::WEXITED) }.not_to raise_error
|
141
145
|
end
|
142
146
|
|
143
147
|
example "waitid method raises expected errors if wrong argument type is passed" do
|
144
|
-
skip 'waitid test skipped on this platform' if hpux || darwin ||
|
148
|
+
skip 'waitid test skipped on this platform' if hpux || darwin || bsd
|
145
149
|
|
146
|
-
pid = fork{ sleep 0.5 }
|
147
|
-
expect{ Process.waitid("foo", pid, Process::WEXITED) }.to raise_error(TypeError)
|
148
|
-
expect{ Process.waitid(Process::P_PID, pid, "foo") }.to raise_error(TypeError)
|
150
|
+
@pid = fork{ sleep 0.5 }
|
151
|
+
expect{ Process.waitid("foo", @pid, Process::WEXITED) }.to raise_error(TypeError)
|
152
|
+
expect{ Process.waitid(Process::P_PID, @pid, "foo") }.to raise_error(TypeError)
|
149
153
|
expect{ Process.waitid(Process::P_PID, "foo", Process::WEXITED) }.to raise_error(TypeError)
|
150
154
|
end
|
151
155
|
|
152
156
|
example "waitid method raises expected error if invalid argument is passed" do
|
153
|
-
skip 'waitid test skipped on this platform' if hpux || darwin ||
|
157
|
+
skip 'waitid test skipped on this platform' if hpux || darwin || bsd
|
154
158
|
|
155
|
-
fork{ sleep 0.5 }
|
159
|
+
@pid = fork{ sleep 0.5 }
|
156
160
|
expect{ Process.waitid(Process::P_PID, 99999999, Process::WEXITED) }.to raise_error(Errno::ECHILD)
|
157
161
|
end
|
158
162
|
|
@@ -165,8 +169,8 @@ RSpec.describe Process do
|
|
165
169
|
example "sigsend works as expected" do
|
166
170
|
skip 'sigsend test skipped on this platform' unless solaris
|
167
171
|
|
168
|
-
pid = fork{ sleep 0.5 }
|
169
|
-
expect{ Process.sigsend(Process::P_PID, pid, 0) }.not_to raise_error
|
172
|
+
@pid = fork{ sleep 0.5 }
|
173
|
+
expect{ Process.sigsend(Process::P_PID, @pid, 0) }.not_to raise_error
|
170
174
|
end
|
171
175
|
|
172
176
|
example "getrusage method is defined" do
|
@@ -174,7 +178,7 @@ RSpec.describe Process do
|
|
174
178
|
end
|
175
179
|
|
176
180
|
example "getrusage works as expected" do
|
177
|
-
fork{ sleep 0.5 }
|
181
|
+
@pid = fork{ sleep 0.5 }
|
178
182
|
|
179
183
|
expect{ Process.getrusage }.not_to raise_error
|
180
184
|
expect{ Process.getrusage(true) }.not_to raise_error
|
@@ -188,7 +192,7 @@ RSpec.describe Process do
|
|
188
192
|
example "getrusage returns the expected struct" do
|
189
193
|
skip 'getrusage only tested on Linux' unless linux
|
190
194
|
|
191
|
-
fork{ sleep 0.5 }
|
195
|
+
@pid = fork{ sleep 0.5 }
|
192
196
|
expect(Process.getrusage).to be_kind_of(Struct::RUsage)
|
193
197
|
expect(Process.getrusage.stime).to be_kind_of(Float)
|
194
198
|
expect(Process.getrusage.utime).to be_kind_of(Float)
|
@@ -199,7 +203,7 @@ RSpec.describe Process do
|
|
199
203
|
end
|
200
204
|
|
201
205
|
example "expected constants are defined" do
|
202
|
-
skip 'wait constant check skipped on this platform' if darwin ||
|
206
|
+
skip 'wait constant check skipped on this platform' if darwin || bsd
|
203
207
|
|
204
208
|
expect(Process::WCONTINUED).not_to be_nil
|
205
209
|
expect(Process::WEXITED).not_to be_nil
|
@@ -211,7 +215,7 @@ RSpec.describe Process do
|
|
211
215
|
end
|
212
216
|
|
213
217
|
example "expected process type flag constants are defined" do
|
214
|
-
skip 'process type flag check skipped on this platform' if linux || darwin ||
|
218
|
+
skip 'process type flag check skipped on this platform' if linux || darwin || bsd
|
215
219
|
|
216
220
|
expect(Process::P_ALL).not_to be_nil
|
217
221
|
expect(Process::P_CID).not_to be_nil
|
@@ -231,4 +235,8 @@ RSpec.describe Process do
|
|
231
235
|
expect(Process::P_TASKID).not_to be_nil
|
232
236
|
expect(Process::P_PROJID).not_to be_nil
|
233
237
|
end
|
238
|
+
|
239
|
+
def after
|
240
|
+
Process.kill(9, @pid) if @pid
|
241
|
+
end
|
234
242
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: proc-wait3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.9.
|
4
|
+
version: 1.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
|
36
36
|
WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2024-02-08 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: rake
|
@@ -81,7 +81,7 @@ files:
|
|
81
81
|
- README.md
|
82
82
|
- Rakefile
|
83
83
|
- certs/djberg96_pub.pem
|
84
|
-
- doc/wait3.
|
84
|
+
- doc/wait3.md
|
85
85
|
- examples/example_getrusage.rb
|
86
86
|
- examples/example_pause.rb
|
87
87
|
- examples/example_wait3.rb
|
@@ -98,10 +98,11 @@ licenses:
|
|
98
98
|
metadata:
|
99
99
|
homepage_uri: https://github.com/djberg96/proc-wait3
|
100
100
|
bug_tracker_uri: https://github.com/djberg96/proc-wait3/issues
|
101
|
-
changelog_uri: https://github.com/djberg96/proc-wait3/blob/
|
101
|
+
changelog_uri: https://github.com/djberg96/proc-wait3/blob/main/CHANGES.md
|
102
102
|
documentation_uri: https://github.com/djberg96/proc-wait3/wiki
|
103
103
|
source_code_uri: https://github.com/djberg96/proc-wait3
|
104
104
|
wiki_uri: https://github.com/djberg96/proc-wait3/wiki
|
105
|
+
rubygems_mfa_required: 'true'
|
105
106
|
post_install_message:
|
106
107
|
rdoc_options: []
|
107
108
|
require_paths:
|
@@ -117,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
118
|
- !ruby/object:Gem::Version
|
118
119
|
version: '0'
|
119
120
|
requirements: []
|
120
|
-
rubygems_version: 3.
|
121
|
+
rubygems_version: 3.1.6
|
121
122
|
signing_key:
|
122
123
|
specification_version: 4
|
123
124
|
summary: Adds wait3, wait4 and other methods to the Process module
|
metadata.gz.sig
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
�2��z"+�t|��ҺL�U��P�y�OM�ي�Q�����3S��pL�8hv�.���JLUy����O�M�'q"Hl-������gіEHGh8����*��vQ�Wr���̩�_�ň찻7��H'MzQS)��e��E�F�,���#g�2>�)�=�������
|
2
|
+
�^�ا���2�h����X����2�N�7����a����k[�>[P��iSG�|
|
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
|