rbs 0.2.0
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 +7 -0
- data/.github/workflows/ruby.yml +28 -0
- data/.gitignore +12 -0
- data/.rubocop.yml +15 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +9 -0
- data/COPYING +56 -0
- data/Gemfile +6 -0
- data/README.md +93 -0
- data/Rakefile +142 -0
- data/bin/annotate-with-rdoc +157 -0
- data/bin/console +14 -0
- data/bin/query-rdoc +103 -0
- data/bin/setup +10 -0
- data/bin/sort +89 -0
- data/bin/test_runner.rb +16 -0
- data/docs/CONTRIBUTING.md +97 -0
- data/docs/sigs.md +148 -0
- data/docs/stdlib.md +152 -0
- data/docs/syntax.md +528 -0
- data/exe/rbs +7 -0
- data/lib/rbs.rb +64 -0
- data/lib/rbs/ast/annotation.rb +27 -0
- data/lib/rbs/ast/comment.rb +27 -0
- data/lib/rbs/ast/declarations.rb +395 -0
- data/lib/rbs/ast/members.rb +362 -0
- data/lib/rbs/buffer.rb +50 -0
- data/lib/rbs/builtin_names.rb +55 -0
- data/lib/rbs/cli.rb +558 -0
- data/lib/rbs/constant.rb +26 -0
- data/lib/rbs/constant_table.rb +150 -0
- data/lib/rbs/definition.rb +170 -0
- data/lib/rbs/definition_builder.rb +919 -0
- data/lib/rbs/environment.rb +281 -0
- data/lib/rbs/environment_loader.rb +136 -0
- data/lib/rbs/environment_walker.rb +124 -0
- data/lib/rbs/errors.rb +187 -0
- data/lib/rbs/location.rb +102 -0
- data/lib/rbs/method_type.rb +123 -0
- data/lib/rbs/namespace.rb +91 -0
- data/lib/rbs/parser.y +1344 -0
- data/lib/rbs/prototype/rb.rb +553 -0
- data/lib/rbs/prototype/rbi.rb +587 -0
- data/lib/rbs/prototype/runtime.rb +381 -0
- data/lib/rbs/substitution.rb +46 -0
- data/lib/rbs/test.rb +26 -0
- data/lib/rbs/test/errors.rb +61 -0
- data/lib/rbs/test/hook.rb +294 -0
- data/lib/rbs/test/setup.rb +58 -0
- data/lib/rbs/test/spy.rb +325 -0
- data/lib/rbs/test/test_helper.rb +183 -0
- data/lib/rbs/test/type_check.rb +254 -0
- data/lib/rbs/type_name.rb +70 -0
- data/lib/rbs/types.rb +936 -0
- data/lib/rbs/variance_calculator.rb +138 -0
- data/lib/rbs/vendorer.rb +47 -0
- data/lib/rbs/version.rb +3 -0
- data/lib/rbs/writer.rb +269 -0
- data/lib/ruby/signature.rb +7 -0
- data/rbs.gemspec +46 -0
- data/stdlib/abbrev/abbrev.rbs +60 -0
- data/stdlib/base64/base64.rbs +71 -0
- data/stdlib/benchmark/benchmark.rbs +372 -0
- data/stdlib/builtin/array.rbs +1997 -0
- data/stdlib/builtin/basic_object.rbs +280 -0
- data/stdlib/builtin/binding.rbs +177 -0
- data/stdlib/builtin/builtin.rbs +45 -0
- data/stdlib/builtin/class.rbs +145 -0
- data/stdlib/builtin/comparable.rbs +116 -0
- data/stdlib/builtin/complex.rbs +400 -0
- data/stdlib/builtin/constants.rbs +37 -0
- data/stdlib/builtin/data.rbs +5 -0
- data/stdlib/builtin/deprecated.rbs +2 -0
- data/stdlib/builtin/dir.rbs +413 -0
- data/stdlib/builtin/encoding.rbs +607 -0
- data/stdlib/builtin/enumerable.rbs +404 -0
- data/stdlib/builtin/enumerator.rbs +260 -0
- data/stdlib/builtin/errno.rbs +781 -0
- data/stdlib/builtin/errors.rbs +582 -0
- data/stdlib/builtin/exception.rbs +194 -0
- data/stdlib/builtin/false_class.rbs +40 -0
- data/stdlib/builtin/fiber.rbs +68 -0
- data/stdlib/builtin/fiber_error.rbs +12 -0
- data/stdlib/builtin/file.rbs +1076 -0
- data/stdlib/builtin/file_test.rbs +59 -0
- data/stdlib/builtin/float.rbs +696 -0
- data/stdlib/builtin/gc.rbs +243 -0
- data/stdlib/builtin/hash.rbs +1029 -0
- data/stdlib/builtin/integer.rbs +707 -0
- data/stdlib/builtin/io.rbs +683 -0
- data/stdlib/builtin/kernel.rbs +576 -0
- data/stdlib/builtin/marshal.rbs +161 -0
- data/stdlib/builtin/match_data.rbs +271 -0
- data/stdlib/builtin/math.rbs +369 -0
- data/stdlib/builtin/method.rbs +185 -0
- data/stdlib/builtin/module.rbs +1104 -0
- data/stdlib/builtin/nil_class.rbs +82 -0
- data/stdlib/builtin/numeric.rbs +409 -0
- data/stdlib/builtin/object.rbs +824 -0
- data/stdlib/builtin/proc.rbs +429 -0
- data/stdlib/builtin/process.rbs +1227 -0
- data/stdlib/builtin/random.rbs +267 -0
- data/stdlib/builtin/range.rbs +226 -0
- data/stdlib/builtin/rational.rbs +424 -0
- data/stdlib/builtin/rb_config.rbs +57 -0
- data/stdlib/builtin/regexp.rbs +1083 -0
- data/stdlib/builtin/ruby_vm.rbs +14 -0
- data/stdlib/builtin/signal.rbs +55 -0
- data/stdlib/builtin/string.rbs +1901 -0
- data/stdlib/builtin/string_io.rbs +284 -0
- data/stdlib/builtin/struct.rbs +40 -0
- data/stdlib/builtin/symbol.rbs +228 -0
- data/stdlib/builtin/thread.rbs +1108 -0
- data/stdlib/builtin/thread_group.rbs +23 -0
- data/stdlib/builtin/time.rbs +1047 -0
- data/stdlib/builtin/trace_point.rbs +290 -0
- data/stdlib/builtin/true_class.rbs +46 -0
- data/stdlib/builtin/unbound_method.rbs +153 -0
- data/stdlib/builtin/warning.rbs +17 -0
- data/stdlib/coverage/coverage.rbs +62 -0
- data/stdlib/csv/csv.rbs +773 -0
- data/stdlib/erb/erb.rbs +392 -0
- data/stdlib/find/find.rbs +40 -0
- data/stdlib/ipaddr/ipaddr.rbs +247 -0
- data/stdlib/json/json.rbs +335 -0
- data/stdlib/pathname/pathname.rbs +1093 -0
- data/stdlib/prime/integer-extension.rbs +23 -0
- data/stdlib/prime/prime.rbs +188 -0
- data/stdlib/securerandom/securerandom.rbs +9 -0
- data/stdlib/set/set.rbs +301 -0
- data/stdlib/tmpdir/tmpdir.rbs +53 -0
- metadata +292 -0
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
# A `Proc` object is an encapsulation of a block of code, which can be
|
|
2
|
+
# stored in a local variable, passed to a method or another
|
|
3
|
+
# [Proc](Proc), and can be called.
|
|
4
|
+
# [Proc](Proc) is an essential concept in Ruby and a
|
|
5
|
+
# core of its functional programming features.
|
|
6
|
+
#
|
|
7
|
+
# ```ruby
|
|
8
|
+
# square = Proc.new {|x| x**2 }
|
|
9
|
+
#
|
|
10
|
+
# square.call(3) #=> 9
|
|
11
|
+
# # shorthands:
|
|
12
|
+
# square.(3) #=> 9
|
|
13
|
+
# square[3] #=> 9
|
|
14
|
+
# ```
|
|
15
|
+
#
|
|
16
|
+
# [Proc](Proc) objects are *closures* , meaning they
|
|
17
|
+
# remember and can use the entire context in which they were created.
|
|
18
|
+
#
|
|
19
|
+
# ```ruby
|
|
20
|
+
# def gen_times(factor)
|
|
21
|
+
# Proc.new {|n| n*factor } # remembers the value of factor at the moment of creation
|
|
22
|
+
# end
|
|
23
|
+
#
|
|
24
|
+
# times3 = gen_times(3)
|
|
25
|
+
# times5 = gen_times(5)
|
|
26
|
+
#
|
|
27
|
+
# times3.call(12) #=> 36
|
|
28
|
+
# times5.call(5) #=> 25
|
|
29
|
+
# times3.call(times5.call(4)) #=> 60
|
|
30
|
+
# ```
|
|
31
|
+
#
|
|
32
|
+
#
|
|
33
|
+
# There are several methods to create a [Proc](Proc)
|
|
34
|
+
#
|
|
35
|
+
# - Use the [Proc](Proc) class constructor:
|
|
36
|
+
#
|
|
37
|
+
# ```ruby
|
|
38
|
+
# proc1 = Proc.new {|x| x**2 }
|
|
39
|
+
# ```
|
|
40
|
+
#
|
|
41
|
+
# - Use the
|
|
42
|
+
# [Kernel\#proc](https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-proc)
|
|
43
|
+
# method as a shorthand of
|
|
44
|
+
# [::new](Proc#method-c-new):
|
|
45
|
+
#
|
|
46
|
+
# ```ruby
|
|
47
|
+
# proc2 = proc {|x| x**2 }
|
|
48
|
+
# ```
|
|
49
|
+
#
|
|
50
|
+
# - Receiving a block of code into proc argument (note the `&` ):
|
|
51
|
+
#
|
|
52
|
+
# ```ruby
|
|
53
|
+
# def make_proc(&block)
|
|
54
|
+
# block
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
# proc3 = make_proc {|x| x**2 }
|
|
58
|
+
# ```
|
|
59
|
+
#
|
|
60
|
+
# - Construct a proc with lambda semantics using the
|
|
61
|
+
# [Kernel\#lambda](https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-lambda)
|
|
62
|
+
# method (see below for explanations about lambdas):
|
|
63
|
+
#
|
|
64
|
+
# ```ruby
|
|
65
|
+
# lambda1 = lambda {|x| x**2 }
|
|
66
|
+
# ```
|
|
67
|
+
#
|
|
68
|
+
# - Use the Lambda literal syntax (also constructs a proc with lambda
|
|
69
|
+
# semantics):
|
|
70
|
+
#
|
|
71
|
+
# ```ruby
|
|
72
|
+
# lambda2 = ->(x) { x**2 }
|
|
73
|
+
# ```
|
|
74
|
+
#
|
|
75
|
+
#
|
|
76
|
+
# Procs are coming in two flavors: lambda and non-lambda (regular procs).
|
|
77
|
+
# Differences are:
|
|
78
|
+
#
|
|
79
|
+
# - In lambdas, `return` means exit from this lambda;
|
|
80
|
+
#
|
|
81
|
+
# - In regular procs, `return` means exit from embracing method (and
|
|
82
|
+
# will throw `LocalJumpError` if invoked outside the method);
|
|
83
|
+
#
|
|
84
|
+
# - In lambdas, arguments are treated in the same way as in methods:
|
|
85
|
+
# strict, with `ArgumentError` for mismatching argument number, and no
|
|
86
|
+
# additional argument processing;
|
|
87
|
+
#
|
|
88
|
+
# - Regular procs accept arguments more generously: missing arguments
|
|
89
|
+
# are filled with `nil`, single
|
|
90
|
+
# [Array](https://ruby-doc.org/core-2.6.3/Array.html) arguments are
|
|
91
|
+
# deconstructed if the proc has multiple arguments, and there is no
|
|
92
|
+
# error raised on extra arguments.
|
|
93
|
+
#
|
|
94
|
+
# Examples:
|
|
95
|
+
#
|
|
96
|
+
# ```ruby
|
|
97
|
+
# p = proc {|x, y| "x=#{x}, y=#{y}" }
|
|
98
|
+
# p.call(1, 2) #=> "x=1, y=2"
|
|
99
|
+
# p.call([1, 2]) #=> "x=1, y=2", array deconstructed
|
|
100
|
+
# p.call(1, 2, 8) #=> "x=1, y=2", extra argument discarded
|
|
101
|
+
# p.call(1) #=> "x=1, y=", nil substituted instead of error
|
|
102
|
+
#
|
|
103
|
+
# l = lambda {|x, y| "x=#{x}, y=#{y}" }
|
|
104
|
+
# l.call(1, 2) #=> "x=1, y=2"
|
|
105
|
+
# l.call([1, 2]) # ArgumentError: wrong number of arguments (given 1, expected 2)
|
|
106
|
+
# l.call(1, 2, 8) # ArgumentError: wrong number of arguments (given 3, expected 2)
|
|
107
|
+
# l.call(1) # ArgumentError: wrong number of arguments (given 1, expected 2)
|
|
108
|
+
#
|
|
109
|
+
# def test_return
|
|
110
|
+
# -> { return 3 }.call # just returns from lambda into method body
|
|
111
|
+
# proc { return 4 }.call # returns from method
|
|
112
|
+
# return 5
|
|
113
|
+
# end
|
|
114
|
+
#
|
|
115
|
+
# test_return # => 4, return from proc
|
|
116
|
+
# ```
|
|
117
|
+
#
|
|
118
|
+
# Lambdas are useful as self-sufficient functions, in particular useful as
|
|
119
|
+
# arguments to higher-order functions, behaving exactly like Ruby methods.
|
|
120
|
+
#
|
|
121
|
+
# Procs are useful for implementing iterators:
|
|
122
|
+
#
|
|
123
|
+
# ```ruby
|
|
124
|
+
# def test
|
|
125
|
+
# [[1, 2], [3, 4], [5, 6]].map {|a, b| return a if a + b > 10 }
|
|
126
|
+
# # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
127
|
+
# end
|
|
128
|
+
# ```
|
|
129
|
+
#
|
|
130
|
+
# Inside `map`, the block of code is treated as a regular (non-lambda)
|
|
131
|
+
# proc, which means that the internal arrays will be deconstructed to
|
|
132
|
+
# pairs of arguments, and `return` will exit from the method `test` . That
|
|
133
|
+
# would not be possible with a stricter lambda.
|
|
134
|
+
#
|
|
135
|
+
# You can tell a lambda from a regular proc by using the
|
|
136
|
+
# [lambda?](Proc#method-i-lambda-3F) instance method.
|
|
137
|
+
#
|
|
138
|
+
# Lambda semantics is typically preserved during the proc lifetime,
|
|
139
|
+
# including `&` -deconstruction to a block of code:
|
|
140
|
+
#
|
|
141
|
+
# ```ruby
|
|
142
|
+
# p = proc {|x, y| x }
|
|
143
|
+
# l = lambda {|x, y| x }
|
|
144
|
+
# [[1, 2], [3, 4]].map(&p) #=> [1, 2]
|
|
145
|
+
# [[1, 2], [3, 4]].map(&l) # ArgumentError: wrong number of arguments (given 1, expected 2)
|
|
146
|
+
# ```
|
|
147
|
+
#
|
|
148
|
+
# The only exception is dynamic method definition: even if defined by
|
|
149
|
+
# passing a non-lambda proc, methods still have normal semantics of
|
|
150
|
+
# argument checking.
|
|
151
|
+
#
|
|
152
|
+
# ```ruby
|
|
153
|
+
# class C
|
|
154
|
+
# define_method(:e, &proc {})
|
|
155
|
+
# end
|
|
156
|
+
# C.new.e(1,2) #=> ArgumentError
|
|
157
|
+
# C.new.method(:e).to_proc.lambda? #=> true
|
|
158
|
+
# ```
|
|
159
|
+
#
|
|
160
|
+
# This exception ensures that methods never have unusual argument passing
|
|
161
|
+
# conventions, and makes it easy to have wrappers defining methods that
|
|
162
|
+
# behave as usual.
|
|
163
|
+
#
|
|
164
|
+
# ```ruby
|
|
165
|
+
# class C
|
|
166
|
+
# def self.def2(name, &body)
|
|
167
|
+
# define_method(name, &body)
|
|
168
|
+
# end
|
|
169
|
+
#
|
|
170
|
+
# def2(:f) {}
|
|
171
|
+
# end
|
|
172
|
+
# C.new.f(1,2) #=> ArgumentError
|
|
173
|
+
# ```
|
|
174
|
+
#
|
|
175
|
+
# The wrapper *def2* receives `body` as a non-lambda proc, yet defines a
|
|
176
|
+
# method which has normal semantics.
|
|
177
|
+
#
|
|
178
|
+
#
|
|
179
|
+
# Any object that implements the `to_proc` method can be converted into a
|
|
180
|
+
# proc by the `&` operator, and therefore con be consumed by iterators.
|
|
181
|
+
#
|
|
182
|
+
# ```ruby
|
|
183
|
+
# class Greater
|
|
184
|
+
# def initialize(greating)
|
|
185
|
+
# @greating = greating
|
|
186
|
+
# end
|
|
187
|
+
#
|
|
188
|
+
# def to_proc
|
|
189
|
+
# proc {|name| "#{@greating}, #{name}!" }
|
|
190
|
+
# end
|
|
191
|
+
# end
|
|
192
|
+
#
|
|
193
|
+
# hi = Greater.new("Hi")
|
|
194
|
+
# hey = Greater.new("Hey")
|
|
195
|
+
# ["Bob", "Jane"].map(&hi) #=> ["Hi, Bob!", "Hi, Jane!"]
|
|
196
|
+
# ["Bob", "Jane"].map(&hey) #=> ["Hey, Bob!", "Hey, Jane!"]
|
|
197
|
+
# ```
|
|
198
|
+
#
|
|
199
|
+
# Of the Ruby core classes, this method is implemented by
|
|
200
|
+
# [Symbol](https://ruby-doc.org/core-2.6.3/Symbol.html),
|
|
201
|
+
# [Method](https://ruby-doc.org/core-2.6.3/Method.html), and
|
|
202
|
+
# [Hash](https://ruby-doc.org/core-2.6.3/Hash.html).
|
|
203
|
+
#
|
|
204
|
+
# :to_s.to_proc.call(1) #=> "1"
|
|
205
|
+
# [1, 2].map(&:to_s) #=> ["1", "2"]
|
|
206
|
+
#
|
|
207
|
+
# method(:puts).to_proc.call(1) # prints 1
|
|
208
|
+
# [1, 2].each(&method(:puts)) # prints 1, 2
|
|
209
|
+
#
|
|
210
|
+
# {test: 1}.to_proc.call(:test) #=> 1
|
|
211
|
+
# %i[test many keys].map(&{test: 1}) #=> [1, nil, nil]
|
|
212
|
+
class Proc < Object
|
|
213
|
+
# Returns the number of mandatory arguments. If the block is declared to
|
|
214
|
+
# take no arguments, returns 0. If the block is known to take exactly n
|
|
215
|
+
# arguments, returns n. If the block has optional arguments, returns -n-1,
|
|
216
|
+
# where n is the number of mandatory arguments, with the exception for
|
|
217
|
+
# blocks that are not lambdas and have only a finite number of optional
|
|
218
|
+
# arguments; in this latter case, returns n. Keyword arguments will be
|
|
219
|
+
# considered as a single additional argument, that argument being
|
|
220
|
+
# mandatory if any keyword argument is mandatory. A `proc` with no
|
|
221
|
+
# argument declarations is the same as a block declaring `||` as its
|
|
222
|
+
# arguments.
|
|
223
|
+
#
|
|
224
|
+
# proc {}.arity #=> 0
|
|
225
|
+
# proc { || }.arity #=> 0
|
|
226
|
+
# proc { |a| }.arity #=> 1
|
|
227
|
+
# proc { |a, b| }.arity #=> 2
|
|
228
|
+
# proc { |a, b, c| }.arity #=> 3
|
|
229
|
+
# proc { |*a| }.arity #=> -1
|
|
230
|
+
# proc { |a, *b| }.arity #=> -2
|
|
231
|
+
# proc { |a, *b, c| }.arity #=> -3
|
|
232
|
+
# proc { |x:, y:, z:0| }.arity #=> 1
|
|
233
|
+
# proc { |*a, x:, y:0| }.arity #=> -2
|
|
234
|
+
#
|
|
235
|
+
# proc { |a=0| }.arity #=> 0
|
|
236
|
+
# lambda { |a=0| }.arity #=> -1
|
|
237
|
+
# proc { |a=0, b| }.arity #=> 1
|
|
238
|
+
# lambda { |a=0, b| }.arity #=> -2
|
|
239
|
+
# proc { |a=0, b=0| }.arity #=> 0
|
|
240
|
+
# lambda { |a=0, b=0| }.arity #=> -1
|
|
241
|
+
# proc { |a, b=0| }.arity #=> 1
|
|
242
|
+
# lambda { |a, b=0| }.arity #=> -2
|
|
243
|
+
# proc { |(a, b), c=0| }.arity #=> 1
|
|
244
|
+
# lambda { |(a, b), c=0| }.arity #=> -2
|
|
245
|
+
# proc { |a, x:0, y:0| }.arity #=> 1
|
|
246
|
+
# lambda { |a, x:0, y:0| }.arity #=> -2
|
|
247
|
+
def arity: () -> Integer
|
|
248
|
+
|
|
249
|
+
# Returns the binding associated with *prc* .
|
|
250
|
+
#
|
|
251
|
+
# ```ruby
|
|
252
|
+
# def fred(param)
|
|
253
|
+
# proc {}
|
|
254
|
+
# end
|
|
255
|
+
#
|
|
256
|
+
# b = fred(99)
|
|
257
|
+
# eval("param", b.binding) #=> 99
|
|
258
|
+
# ```
|
|
259
|
+
def binding: () -> Binding
|
|
260
|
+
|
|
261
|
+
def call: (*untyped arg0) -> untyped
|
|
262
|
+
|
|
263
|
+
def []: (*untyped arg0) -> untyped
|
|
264
|
+
|
|
265
|
+
def curry: (?Integer arity) -> Proc
|
|
266
|
+
|
|
267
|
+
# Returns a hash value corresponding to proc body.
|
|
268
|
+
#
|
|
269
|
+
# See also Object\#hash.
|
|
270
|
+
def hash: () -> Integer
|
|
271
|
+
|
|
272
|
+
def initialize: () -> void
|
|
273
|
+
| () { (*untyped) -> untyped } -> void
|
|
274
|
+
|
|
275
|
+
# Returns `true` for a [Proc](Proc.downloaded.ruby_doc) object for which
|
|
276
|
+
# argument handling is rigid. Such procs are typically generated by
|
|
277
|
+
# `lambda` .
|
|
278
|
+
#
|
|
279
|
+
# A [Proc](Proc.downloaded.ruby_doc) object generated by `proc` ignores
|
|
280
|
+
# extra arguments.
|
|
281
|
+
#
|
|
282
|
+
# ```ruby
|
|
283
|
+
# proc {|a,b| [a,b] }.call(1,2,3) #=> [1,2]
|
|
284
|
+
# ```
|
|
285
|
+
#
|
|
286
|
+
# It provides `nil` for missing arguments.
|
|
287
|
+
#
|
|
288
|
+
# ```ruby
|
|
289
|
+
# proc {|a,b| [a,b] }.call(1) #=> [1,nil]
|
|
290
|
+
# ```
|
|
291
|
+
#
|
|
292
|
+
# It expands a single array argument.
|
|
293
|
+
#
|
|
294
|
+
# ```ruby
|
|
295
|
+
# proc {|a,b| [a,b] }.call([1,2]) #=> [1,2]
|
|
296
|
+
# ```
|
|
297
|
+
#
|
|
298
|
+
# A [Proc](Proc.downloaded.ruby_doc) object generated by `lambda` doesn’t
|
|
299
|
+
# have such tricks.
|
|
300
|
+
#
|
|
301
|
+
# ```ruby
|
|
302
|
+
# lambda {|a,b| [a,b] }.call(1,2,3) #=> ArgumentError
|
|
303
|
+
# lambda {|a,b| [a,b] }.call(1) #=> ArgumentError
|
|
304
|
+
# lambda {|a,b| [a,b] }.call([1,2]) #=> ArgumentError
|
|
305
|
+
# ```
|
|
306
|
+
#
|
|
307
|
+
# [\#lambda?](Proc.downloaded.ruby_doc#method-i-lambda-3F) is a predicate
|
|
308
|
+
# for the tricks. It returns `true` if no tricks apply.
|
|
309
|
+
#
|
|
310
|
+
# ```ruby
|
|
311
|
+
# lambda {}.lambda? #=> true
|
|
312
|
+
# proc {}.lambda? #=> false
|
|
313
|
+
# ```
|
|
314
|
+
#
|
|
315
|
+
# [::new](Proc.downloaded.ruby_doc#method-c-new) is the same as `proc` .
|
|
316
|
+
#
|
|
317
|
+
# ```ruby
|
|
318
|
+
# Proc.new {}.lambda? #=> false
|
|
319
|
+
# ```
|
|
320
|
+
#
|
|
321
|
+
# `lambda`, `proc` and [::new](Proc.downloaded.ruby_doc#method-c-new)
|
|
322
|
+
# preserve the tricks of a [Proc](Proc.downloaded.ruby_doc) object given
|
|
323
|
+
# by `&` argument.
|
|
324
|
+
#
|
|
325
|
+
# ```ruby
|
|
326
|
+
# lambda(&lambda {}).lambda? #=> true
|
|
327
|
+
# proc(&lambda {}).lambda? #=> true
|
|
328
|
+
# Proc.new(&lambda {}).lambda? #=> true
|
|
329
|
+
#
|
|
330
|
+
# lambda(&proc {}).lambda? #=> false
|
|
331
|
+
# proc(&proc {}).lambda? #=> false
|
|
332
|
+
# Proc.new(&proc {}).lambda? #=> false
|
|
333
|
+
# ```
|
|
334
|
+
#
|
|
335
|
+
# A [Proc](Proc.downloaded.ruby_doc) object generated by `&` argument has
|
|
336
|
+
# the tricks
|
|
337
|
+
#
|
|
338
|
+
# ```ruby
|
|
339
|
+
# def n(&b) b.lambda? end
|
|
340
|
+
# n {} #=> false
|
|
341
|
+
# ```
|
|
342
|
+
#
|
|
343
|
+
# The `&` argument preserves the tricks if a
|
|
344
|
+
# [Proc](Proc.downloaded.ruby_doc) object is given by `&` argument.
|
|
345
|
+
#
|
|
346
|
+
# ```ruby
|
|
347
|
+
# n(&lambda {}) #=> true
|
|
348
|
+
# n(&proc {}) #=> false
|
|
349
|
+
# n(&Proc.new {}) #=> false
|
|
350
|
+
# ```
|
|
351
|
+
#
|
|
352
|
+
# A [Proc](Proc.downloaded.ruby_doc) object converted from a method has no
|
|
353
|
+
# tricks.
|
|
354
|
+
#
|
|
355
|
+
# ```ruby
|
|
356
|
+
# def m() end
|
|
357
|
+
# method(:m).to_proc.lambda? #=> true
|
|
358
|
+
#
|
|
359
|
+
# n(&method(:m)) #=> true
|
|
360
|
+
# n(&method(:m).to_proc) #=> true
|
|
361
|
+
# ```
|
|
362
|
+
#
|
|
363
|
+
# `define_method` is treated the same as method definition. The defined
|
|
364
|
+
# method has no tricks.
|
|
365
|
+
#
|
|
366
|
+
# ```ruby
|
|
367
|
+
# class C
|
|
368
|
+
# define_method(:d) {}
|
|
369
|
+
# end
|
|
370
|
+
# C.new.d(1,2) #=> ArgumentError
|
|
371
|
+
# C.new.method(:d).to_proc.lambda? #=> true
|
|
372
|
+
# ```
|
|
373
|
+
#
|
|
374
|
+
# `define_method` always defines a method without the tricks, even if a
|
|
375
|
+
# non-lambda [Proc](Proc.downloaded.ruby_doc) object is given. This is the
|
|
376
|
+
# only exception for which the tricks are not preserved.
|
|
377
|
+
#
|
|
378
|
+
# ```ruby
|
|
379
|
+
# class C
|
|
380
|
+
# define_method(:e, &proc {})
|
|
381
|
+
# end
|
|
382
|
+
# C.new.e(1,2) #=> ArgumentError
|
|
383
|
+
# C.new.method(:e).to_proc.lambda? #=> true
|
|
384
|
+
# ```
|
|
385
|
+
#
|
|
386
|
+
# This exception ensures that methods never have tricks and makes it easy
|
|
387
|
+
# to have wrappers to define methods that behave as usual.
|
|
388
|
+
#
|
|
389
|
+
# ```ruby
|
|
390
|
+
# class C
|
|
391
|
+
# def self.def2(name, &body)
|
|
392
|
+
# define_method(name, &body)
|
|
393
|
+
# end
|
|
394
|
+
#
|
|
395
|
+
# def2(:f) {}
|
|
396
|
+
# end
|
|
397
|
+
# C.new.f(1,2) #=> ArgumentError
|
|
398
|
+
# ```
|
|
399
|
+
#
|
|
400
|
+
# The wrapper *def2* defines a method which has no tricks.
|
|
401
|
+
def lambda?: () -> bool
|
|
402
|
+
|
|
403
|
+
# Returns the parameter information of this proc.
|
|
404
|
+
#
|
|
405
|
+
# ```ruby
|
|
406
|
+
# prc = lambda{|x, y=42, *other|}
|
|
407
|
+
# prc.parameters #=> [[:req, :x], [:opt, :y], [:rest, :other]]
|
|
408
|
+
# ```
|
|
409
|
+
def parameters: () -> ::Array[[ Symbol, Symbol ]]
|
|
410
|
+
|
|
411
|
+
# Returns the Ruby source filename and line number containing this proc or
|
|
412
|
+
# `nil` if this proc was not defined in Ruby (i.e. native).
|
|
413
|
+
def source_location: () -> [ String, Integer ]
|
|
414
|
+
|
|
415
|
+
# Part of the protocol for converting objects to `Proc` objects. Instances
|
|
416
|
+
# of class `Proc` simply return themselves.
|
|
417
|
+
def to_proc: () -> self
|
|
418
|
+
|
|
419
|
+
# Returns the unique identifier for this proc, along with an indication of
|
|
420
|
+
# where the proc was defined.
|
|
421
|
+
#
|
|
422
|
+
#
|
|
423
|
+
#
|
|
424
|
+
# Also aliased as: [inspect](Proc.downloaded.ruby_doc#method-i-inspect)
|
|
425
|
+
def to_s: () -> String
|
|
426
|
+
|
|
427
|
+
# Alias for: [to\_s](Proc.downloaded.ruby_doc#method-i-to_s)
|
|
428
|
+
def inspect: () -> String
|
|
429
|
+
end
|
|
@@ -0,0 +1,1227 @@
|
|
|
1
|
+
# The module contains several groups of functionality for handling OS processes:
|
|
2
|
+
#
|
|
3
|
+
# * Low-level property introspection and management of the current process,
|
|
4
|
+
# like Process.argv0, Process.pid;
|
|
5
|
+
# * Low-level introspection of other processes, like Process.getpgid,
|
|
6
|
+
# Process.getpriority;
|
|
7
|
+
# * Management of the current process: Process.abort, Process.exit,
|
|
8
|
+
# Process.daemon, etc. (for convenience, most of those are also available as
|
|
9
|
+
# global functions and module functions of Kernel);
|
|
10
|
+
# * Creation and management of child processes: Process.fork, Process.spawn,
|
|
11
|
+
# and related methods;
|
|
12
|
+
# * Management of low-level system clock: Process.times and
|
|
13
|
+
# Process.clock_gettime, which could be important for proper benchmarking
|
|
14
|
+
# and other elapsed time measurement tasks.
|
|
15
|
+
#
|
|
16
|
+
#
|
|
17
|
+
module Process
|
|
18
|
+
# Returns the name of the script being executed. The value is not affected by
|
|
19
|
+
# assigning a new value to $0.
|
|
20
|
+
#
|
|
21
|
+
# This method first appeared in Ruby 2.1 to serve as a global variable free
|
|
22
|
+
# means to get the script name.
|
|
23
|
+
#
|
|
24
|
+
def self.argv0: () -> String
|
|
25
|
+
|
|
26
|
+
# Returns the time resolution returned by POSIX clock_getres() function.
|
|
27
|
+
#
|
|
28
|
+
# `clock_id` specifies a kind of clock. See the document of
|
|
29
|
+
# `Process.clock_gettime` for details.
|
|
30
|
+
#
|
|
31
|
+
# `clock_id` can be a symbol as `Process.clock_gettime`. However the result may
|
|
32
|
+
# not be accurate. For example,
|
|
33
|
+
# `Process.clock_getres(:GETTIMEOFDAY_BASED_CLOCK_REALTIME)` returns 1.0e-06
|
|
34
|
+
# which means 1 microsecond, but actual resolution can be more coarse.
|
|
35
|
+
#
|
|
36
|
+
# If the given `clock_id` is not supported, Errno::EINVAL is raised.
|
|
37
|
+
#
|
|
38
|
+
# `unit` specifies a type of the return value. `Process.clock_getres` accepts
|
|
39
|
+
# `unit` as `Process.clock_gettime`. The default value, `:float_second`, is also
|
|
40
|
+
# same as `Process.clock_gettime`.
|
|
41
|
+
#
|
|
42
|
+
# `Process.clock_getres` also accepts `:hertz` as `unit`. `:hertz` means a the
|
|
43
|
+
# reciprocal of `:float_second`.
|
|
44
|
+
#
|
|
45
|
+
# `:hertz` can be used to obtain the exact value of the clock ticks per second
|
|
46
|
+
# for times() function and CLOCKS_PER_SEC for clock() function.
|
|
47
|
+
#
|
|
48
|
+
# `Process.clock_getres(:TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID, :hertz)` returns
|
|
49
|
+
# the clock ticks per second.
|
|
50
|
+
#
|
|
51
|
+
# `Process.clock_getres(:CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID, :hertz)` returns
|
|
52
|
+
# CLOCKS_PER_SEC.
|
|
53
|
+
#
|
|
54
|
+
# p Process.clock_getres(Process::CLOCK_MONOTONIC)
|
|
55
|
+
# #=> 1.0e-09
|
|
56
|
+
#
|
|
57
|
+
def self.clock_getres: (Symbol | Integer clock_id, ?Symbol unit) -> (Float | Integer)
|
|
58
|
+
|
|
59
|
+
# Returns a time returned by POSIX clock_gettime() function.
|
|
60
|
+
#
|
|
61
|
+
# p Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
62
|
+
# #=> 896053.968060096
|
|
63
|
+
#
|
|
64
|
+
# `clock_id` specifies a kind of clock. It is specified as a constant which
|
|
65
|
+
# begins with `Process::CLOCK_` such as Process::CLOCK_REALTIME and
|
|
66
|
+
# Process::CLOCK_MONOTONIC.
|
|
67
|
+
#
|
|
68
|
+
# The supported constants depends on OS and version. Ruby provides following
|
|
69
|
+
# types of `clock_id` if available.
|
|
70
|
+
#
|
|
71
|
+
# CLOCK_REALTIME
|
|
72
|
+
# : SUSv2 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 2.1, macOS
|
|
73
|
+
# 10.12
|
|
74
|
+
# CLOCK_MONOTONIC
|
|
75
|
+
# : SUSv3 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4, macOS
|
|
76
|
+
# 10.12
|
|
77
|
+
# CLOCK_PROCESS_CPUTIME_ID
|
|
78
|
+
# : SUSv3 to 4, Linux 2.5.63, FreeBSD 9.3, OpenBSD 5.4, macOS 10.12
|
|
79
|
+
# CLOCK_THREAD_CPUTIME_ID
|
|
80
|
+
# : SUSv3 to 4, Linux 2.5.63, FreeBSD 7.1, OpenBSD 5.4, macOS 10.12
|
|
81
|
+
# CLOCK_VIRTUAL
|
|
82
|
+
# : FreeBSD 3.0, OpenBSD 2.1
|
|
83
|
+
# CLOCK_PROF
|
|
84
|
+
# : FreeBSD 3.0, OpenBSD 2.1
|
|
85
|
+
# CLOCK_REALTIME_FAST
|
|
86
|
+
# : FreeBSD 8.1
|
|
87
|
+
# CLOCK_REALTIME_PRECISE
|
|
88
|
+
# : FreeBSD 8.1
|
|
89
|
+
# CLOCK_REALTIME_COARSE
|
|
90
|
+
# : Linux 2.6.32
|
|
91
|
+
# CLOCK_REALTIME_ALARM
|
|
92
|
+
# : Linux 3.0
|
|
93
|
+
# CLOCK_MONOTONIC_FAST
|
|
94
|
+
# : FreeBSD 8.1
|
|
95
|
+
# CLOCK_MONOTONIC_PRECISE
|
|
96
|
+
# : FreeBSD 8.1
|
|
97
|
+
# CLOCK_MONOTONIC_COARSE
|
|
98
|
+
# : Linux 2.6.32
|
|
99
|
+
# CLOCK_MONOTONIC_RAW
|
|
100
|
+
# : Linux 2.6.28, macOS 10.12
|
|
101
|
+
# CLOCK_MONOTONIC_RAW_APPROX
|
|
102
|
+
# : macOS 10.12
|
|
103
|
+
# CLOCK_BOOTTIME
|
|
104
|
+
# : Linux 2.6.39
|
|
105
|
+
# CLOCK_BOOTTIME_ALARM
|
|
106
|
+
# : Linux 3.0
|
|
107
|
+
# CLOCK_UPTIME
|
|
108
|
+
# : FreeBSD 7.0, OpenBSD 5.5
|
|
109
|
+
# CLOCK_UPTIME_FAST
|
|
110
|
+
# : FreeBSD 8.1
|
|
111
|
+
# CLOCK_UPTIME_RAW
|
|
112
|
+
# : macOS 10.12
|
|
113
|
+
# CLOCK_UPTIME_RAW_APPROX
|
|
114
|
+
# : macOS 10.12
|
|
115
|
+
# CLOCK_UPTIME_PRECISE
|
|
116
|
+
# : FreeBSD 8.1
|
|
117
|
+
# CLOCK_SECOND
|
|
118
|
+
# : FreeBSD 8.1
|
|
119
|
+
# CLOCK_TAI
|
|
120
|
+
# : Linux 3.10
|
|
121
|
+
#
|
|
122
|
+
#
|
|
123
|
+
# Note that SUS stands for Single Unix Specification. SUS contains POSIX and
|
|
124
|
+
# clock_gettime is defined in the POSIX part. SUS defines CLOCK_REALTIME
|
|
125
|
+
# mandatory but CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID and
|
|
126
|
+
# CLOCK_THREAD_CPUTIME_ID are optional.
|
|
127
|
+
#
|
|
128
|
+
# Also, several symbols are accepted as `clock_id`. There are emulations for
|
|
129
|
+
# clock_gettime().
|
|
130
|
+
#
|
|
131
|
+
# For example, Process::CLOCK_REALTIME is defined as
|
|
132
|
+
# `:GETTIMEOFDAY_BASED_CLOCK_REALTIME` when clock_gettime() is not available.
|
|
133
|
+
#
|
|
134
|
+
# Emulations for `CLOCK_REALTIME`:
|
|
135
|
+
# :GETTIMEOFDAY_BASED_CLOCK_REALTIME
|
|
136
|
+
# : Use gettimeofday() defined by SUS. (SUSv4 obsoleted it, though.) The
|
|
137
|
+
# resolution is 1 microsecond.
|
|
138
|
+
# :TIME_BASED_CLOCK_REALTIME
|
|
139
|
+
# : Use time() defined by ISO C. The resolution is 1 second.
|
|
140
|
+
#
|
|
141
|
+
#
|
|
142
|
+
# Emulations for `CLOCK_MONOTONIC`:
|
|
143
|
+
# :MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC
|
|
144
|
+
# : Use mach_absolute_time(), available on Darwin. The resolution is CPU
|
|
145
|
+
# dependent.
|
|
146
|
+
# :TIMES_BASED_CLOCK_MONOTONIC
|
|
147
|
+
# : Use the result value of times() defined by POSIX. POSIX defines it as
|
|
148
|
+
# "times() shall return the elapsed real time, in clock ticks, since an
|
|
149
|
+
# arbitrary point in the past (for example, system start-up time)". For
|
|
150
|
+
# example, GNU/Linux returns a value based on jiffies and it is monotonic.
|
|
151
|
+
# However, 4.4BSD uses gettimeofday() and it is not monotonic. (FreeBSD uses
|
|
152
|
+
# clock_gettime(CLOCK_MONOTONIC) instead, though.) The resolution is the
|
|
153
|
+
# clock tick. "getconf CLK_TCK" command shows the clock ticks per second.
|
|
154
|
+
# (The clock ticks per second is defined by HZ macro in older systems.) If
|
|
155
|
+
# it is 100 and clock_t is 32 bits integer type, the resolution is 10
|
|
156
|
+
# millisecond and cannot represent over 497 days.
|
|
157
|
+
#
|
|
158
|
+
#
|
|
159
|
+
# Emulations for `CLOCK_PROCESS_CPUTIME_ID`:
|
|
160
|
+
# :GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID
|
|
161
|
+
# : Use getrusage() defined by SUS. getrusage() is used with RUSAGE_SELF to
|
|
162
|
+
# obtain the time only for the calling process (excluding the time for child
|
|
163
|
+
# processes). The result is addition of user time (ru_utime) and system time
|
|
164
|
+
# (ru_stime). The resolution is 1 microsecond.
|
|
165
|
+
# :TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID
|
|
166
|
+
# : Use times() defined by POSIX. The result is addition of user time
|
|
167
|
+
# (tms_utime) and system time (tms_stime). tms_cutime and tms_cstime are
|
|
168
|
+
# ignored to exclude the time for child processes. The resolution is the
|
|
169
|
+
# clock tick. "getconf CLK_TCK" command shows the clock ticks per second.
|
|
170
|
+
# (The clock ticks per second is defined by HZ macro in older systems.) If
|
|
171
|
+
# it is 100, the resolution is 10 millisecond.
|
|
172
|
+
# :CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID
|
|
173
|
+
# : Use clock() defined by ISO C. The resolution is 1/CLOCKS_PER_SEC.
|
|
174
|
+
# CLOCKS_PER_SEC is the C-level macro defined by time.h. SUS defines
|
|
175
|
+
# CLOCKS_PER_SEC is 1000000. Non-Unix systems may define it a different
|
|
176
|
+
# value, though. If CLOCKS_PER_SEC is 1000000 as SUS, the resolution is 1
|
|
177
|
+
# microsecond. If CLOCKS_PER_SEC is 1000000 and clock_t is 32 bits integer
|
|
178
|
+
# type, it cannot represent over 72 minutes.
|
|
179
|
+
#
|
|
180
|
+
#
|
|
181
|
+
# If the given `clock_id` is not supported, Errno::EINVAL is raised.
|
|
182
|
+
#
|
|
183
|
+
# `unit` specifies a type of the return value.
|
|
184
|
+
#
|
|
185
|
+
# :float_second
|
|
186
|
+
# : number of seconds as a float (default)
|
|
187
|
+
# :float_millisecond
|
|
188
|
+
# : number of milliseconds as a float
|
|
189
|
+
# :float_microsecond
|
|
190
|
+
# : number of microseconds as a float
|
|
191
|
+
# :second
|
|
192
|
+
# : number of seconds as an integer
|
|
193
|
+
# :millisecond
|
|
194
|
+
# : number of milliseconds as an integer
|
|
195
|
+
# :microsecond
|
|
196
|
+
# : number of microseconds as an integer
|
|
197
|
+
# :nanosecond
|
|
198
|
+
# : number of nanoseconds as an integer
|
|
199
|
+
#
|
|
200
|
+
#
|
|
201
|
+
# The underlying function, clock_gettime(), returns a number of nanoseconds.
|
|
202
|
+
# Float object (IEEE 754 double) is not enough to represent the return value for
|
|
203
|
+
# CLOCK_REALTIME. If the exact nanoseconds value is required, use `:nanoseconds`
|
|
204
|
+
# as the `unit`.
|
|
205
|
+
#
|
|
206
|
+
# The origin (zero) of the returned value varies. For example, system start up
|
|
207
|
+
# time, process start up time, the Epoch, etc.
|
|
208
|
+
#
|
|
209
|
+
# The origin in CLOCK_REALTIME is defined as the Epoch (1970-01-01 00:00:00
|
|
210
|
+
# UTC). But some systems count leap seconds and others doesn't. So the result
|
|
211
|
+
# can be interpreted differently across systems. Time.now is recommended over
|
|
212
|
+
# CLOCK_REALTIME.
|
|
213
|
+
#
|
|
214
|
+
def self.clock_gettime: (Symbol | Integer clock_id, ?Symbol unit) -> (Float | Integer)
|
|
215
|
+
|
|
216
|
+
# Detach the process from controlling terminal and run in the background as
|
|
217
|
+
# system daemon. Unless the argument nochdir is true (i.e. non false), it
|
|
218
|
+
# changes the current working directory to the root ("/"). Unless the argument
|
|
219
|
+
# noclose is true, daemon() will redirect standard input, standard output and
|
|
220
|
+
# standard error to /dev/null. Return zero on success, or raise one of Errno::*.
|
|
221
|
+
#
|
|
222
|
+
def self.daemon: (?untyped nochdir, ?untyped noclose) -> Integer
|
|
223
|
+
|
|
224
|
+
# Some operating systems retain the status of terminated child processes until
|
|
225
|
+
# the parent collects that status (normally using some variant of `wait()`). If
|
|
226
|
+
# the parent never collects this status, the child stays around as a *zombie*
|
|
227
|
+
# process. Process::detach prevents this by setting up a separate Ruby thread
|
|
228
|
+
# whose sole job is to reap the status of the process *pid* when it terminates.
|
|
229
|
+
# Use #detach only when you do not intend to explicitly wait for the child to
|
|
230
|
+
# terminate.
|
|
231
|
+
#
|
|
232
|
+
# The waiting thread returns the exit status of the detached process when it
|
|
233
|
+
# terminates, so you can use Thread#join to know the result. If specified *pid*
|
|
234
|
+
# is not a valid child process ID, the thread returns `nil` immediately.
|
|
235
|
+
#
|
|
236
|
+
# The waiting thread has #pid method which returns the pid.
|
|
237
|
+
#
|
|
238
|
+
# In this first example, we don't reap the first child process, so it appears as
|
|
239
|
+
# a zombie in the process status display.
|
|
240
|
+
#
|
|
241
|
+
# p1 = fork { sleep 0.1 }
|
|
242
|
+
# p2 = fork { sleep 0.2 }
|
|
243
|
+
# Process.waitpid(p2)
|
|
244
|
+
# sleep 2
|
|
245
|
+
# system("ps -ho pid,state -p #{p1}")
|
|
246
|
+
#
|
|
247
|
+
# *produces:*
|
|
248
|
+
#
|
|
249
|
+
# 27389 Z
|
|
250
|
+
#
|
|
251
|
+
# In the next example, Process::detach is used to reap the child automatically.
|
|
252
|
+
#
|
|
253
|
+
# p1 = fork { sleep 0.1 }
|
|
254
|
+
# p2 = fork { sleep 0.2 }
|
|
255
|
+
# Process.detach(p1)
|
|
256
|
+
# Process.waitpid(p2)
|
|
257
|
+
# sleep 2
|
|
258
|
+
# system("ps -ho pid,state -p #{p1}")
|
|
259
|
+
#
|
|
260
|
+
# *(produces no output)*
|
|
261
|
+
#
|
|
262
|
+
def self.detach: (Integer pid) -> Thread
|
|
263
|
+
|
|
264
|
+
# Returns the effective group ID for this process. Not available on all
|
|
265
|
+
# platforms.
|
|
266
|
+
#
|
|
267
|
+
# Process.egid #=> 500
|
|
268
|
+
#
|
|
269
|
+
def self.egid: () -> Integer
|
|
270
|
+
|
|
271
|
+
# Sets the effective group ID for this process. Not available on all platforms.
|
|
272
|
+
#
|
|
273
|
+
def self.egid=: (Integer arg0) -> Integer
|
|
274
|
+
|
|
275
|
+
# Returns the effective user ID for this process.
|
|
276
|
+
#
|
|
277
|
+
# Process.euid #=> 501
|
|
278
|
+
#
|
|
279
|
+
def self.euid: () -> Integer
|
|
280
|
+
|
|
281
|
+
# Sets the effective user ID for this process. Not available on all platforms.
|
|
282
|
+
#
|
|
283
|
+
def self.euid=: (Integer arg0) -> Integer
|
|
284
|
+
|
|
285
|
+
# Returns the process group ID for the given process id. Not available on all
|
|
286
|
+
# platforms.
|
|
287
|
+
#
|
|
288
|
+
# Process.getpgid(Process.ppid()) #=> 25527
|
|
289
|
+
#
|
|
290
|
+
def self.getpgid: (Integer pid) -> Integer
|
|
291
|
+
|
|
292
|
+
# Returns the process group ID for this process. Not available on all platforms.
|
|
293
|
+
#
|
|
294
|
+
# Process.getpgid(0) #=> 25527
|
|
295
|
+
# Process.getpgrp #=> 25527
|
|
296
|
+
#
|
|
297
|
+
def self.getpgrp: () -> Integer
|
|
298
|
+
|
|
299
|
+
# Gets the scheduling priority for specified process, process group, or user.
|
|
300
|
+
# *kind* indicates the kind of entity to find: one of Process::PRIO_PGRP,
|
|
301
|
+
# Process::PRIO_USER, or Process::PRIO_PROCESS. *integer* is an id indicating
|
|
302
|
+
# the particular process, process group, or user (an id of 0 means *current*).
|
|
303
|
+
# Lower priorities are more favorable for scheduling. Not available on all
|
|
304
|
+
# platforms.
|
|
305
|
+
#
|
|
306
|
+
# Process.getpriority(Process::PRIO_USER, 0) #=> 19
|
|
307
|
+
# Process.getpriority(Process::PRIO_PROCESS, 0) #=> 19
|
|
308
|
+
#
|
|
309
|
+
def self.getpriority: (Integer kind, Integer arg0) -> Integer
|
|
310
|
+
|
|
311
|
+
# Gets the resource limit of the process. *cur_limit* means current (soft) limit
|
|
312
|
+
# and *max_limit* means maximum (hard) limit.
|
|
313
|
+
#
|
|
314
|
+
# *resource* indicates the kind of resource to limit. It is specified as a
|
|
315
|
+
# symbol such as `:CORE`, a string such as `"CORE"` or a constant such as
|
|
316
|
+
# Process::RLIMIT_CORE. See Process.setrlimit for details.
|
|
317
|
+
#
|
|
318
|
+
# *cur_limit* and *max_limit* may be Process::RLIM_INFINITY,
|
|
319
|
+
# Process::RLIM_SAVED_MAX or Process::RLIM_SAVED_CUR. See Process.setrlimit and
|
|
320
|
+
# the system getrlimit(2) manual for details.
|
|
321
|
+
#
|
|
322
|
+
def self.getrlimit: (Symbol | String | Integer resource) -> [ Integer, Integer ]
|
|
323
|
+
|
|
324
|
+
# Returns the session ID for the given process id. If not given, return current
|
|
325
|
+
# process sid. Not available on all platforms.
|
|
326
|
+
#
|
|
327
|
+
# Process.getsid() #=> 27422
|
|
328
|
+
# Process.getsid(0) #=> 27422
|
|
329
|
+
# Process.getsid(Process.pid()) #=> 27422
|
|
330
|
+
#
|
|
331
|
+
def self.getsid: (?Integer pid) -> Integer
|
|
332
|
+
|
|
333
|
+
# Returns the (real) group ID for this process.
|
|
334
|
+
#
|
|
335
|
+
# Process.gid #=> 500
|
|
336
|
+
#
|
|
337
|
+
def self.gid: () -> Integer
|
|
338
|
+
|
|
339
|
+
# Sets the group ID for this process.
|
|
340
|
+
#
|
|
341
|
+
def self.gid=: (Integer arg0) -> Integer
|
|
342
|
+
|
|
343
|
+
# Get an Array of the group IDs in the supplemental group access list for this
|
|
344
|
+
# process.
|
|
345
|
+
#
|
|
346
|
+
# Process.groups #=> [27, 6, 10, 11]
|
|
347
|
+
#
|
|
348
|
+
# Note that this method is just a wrapper of getgroups(2). This means that the
|
|
349
|
+
# following characteristics of the result completely depend on your system:
|
|
350
|
+
#
|
|
351
|
+
# * the result is sorted
|
|
352
|
+
# * the result includes effective GIDs
|
|
353
|
+
# * the result does not include duplicated GIDs
|
|
354
|
+
#
|
|
355
|
+
#
|
|
356
|
+
# You can make sure to get a sorted unique GID list of the current process by
|
|
357
|
+
# this expression:
|
|
358
|
+
#
|
|
359
|
+
# Process.groups.uniq.sort
|
|
360
|
+
#
|
|
361
|
+
def self.groups: () -> ::Array[Integer]
|
|
362
|
+
|
|
363
|
+
# Set the supplemental group access list to the given Array of group IDs.
|
|
364
|
+
#
|
|
365
|
+
# Process.groups #=> [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27]
|
|
366
|
+
# Process.groups = [27, 6, 10, 11] #=> [27, 6, 10, 11]
|
|
367
|
+
# Process.groups #=> [27, 6, 10, 11]
|
|
368
|
+
#
|
|
369
|
+
def self.groups=: (::Array[Integer] arg0) -> ::Array[Integer]
|
|
370
|
+
|
|
371
|
+
# Initializes the supplemental group access list by reading the system group
|
|
372
|
+
# database and using all groups of which the given user is a member. The group
|
|
373
|
+
# with the specified *gid* is also added to the list. Returns the resulting
|
|
374
|
+
# Array of the gids of all the groups in the supplementary group access list.
|
|
375
|
+
# Not available on all platforms.
|
|
376
|
+
#
|
|
377
|
+
# Process.groups #=> [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27]
|
|
378
|
+
# Process.initgroups( "mgranger", 30 ) #=> [30, 6, 10, 11]
|
|
379
|
+
# Process.groups #=> [30, 6, 10, 11]
|
|
380
|
+
#
|
|
381
|
+
def self.initgroups: (String username, Integer gid) -> ::Array[Integer]
|
|
382
|
+
|
|
383
|
+
# Sends the given signal to the specified process id(s) if *pid* is positive. If
|
|
384
|
+
# *pid* is zero, *signal* is sent to all processes whose group ID is equal to
|
|
385
|
+
# the group ID of the process. If *pid* is negative, results are dependent on
|
|
386
|
+
# the operating system. *signal* may be an integer signal number or a POSIX
|
|
387
|
+
# signal name (either with or without a `SIG` prefix). If *signal* is negative
|
|
388
|
+
# (or starts with a minus sign), kills process groups instead of processes. Not
|
|
389
|
+
# all signals are available on all platforms. The keys and values of Signal.list
|
|
390
|
+
# are known signal names and numbers, respectively.
|
|
391
|
+
#
|
|
392
|
+
# pid = fork do
|
|
393
|
+
# Signal.trap("HUP") { puts "Ouch!"; exit }
|
|
394
|
+
# # ... do some work ...
|
|
395
|
+
# end
|
|
396
|
+
# # ...
|
|
397
|
+
# Process.kill("HUP", pid)
|
|
398
|
+
# Process.wait
|
|
399
|
+
#
|
|
400
|
+
# *produces:*
|
|
401
|
+
#
|
|
402
|
+
# Ouch!
|
|
403
|
+
#
|
|
404
|
+
# If *signal* is an integer but wrong for signal, Errno::EINVAL or RangeError
|
|
405
|
+
# will be raised. Otherwise unless *signal* is a String or a Symbol, and a
|
|
406
|
+
# known signal name, ArgumentError will be raised.
|
|
407
|
+
#
|
|
408
|
+
# Also, Errno::ESRCH or RangeError for invalid *pid*, Errno::EPERM when failed
|
|
409
|
+
# because of no privilege, will be raised. In these cases, signals may have
|
|
410
|
+
# been sent to preceding processes.
|
|
411
|
+
#
|
|
412
|
+
def self.kill: (Integer | Symbol | String signal, *Integer pids) -> Integer
|
|
413
|
+
|
|
414
|
+
# Returns the maximum number of gids allowed in the supplemental group access
|
|
415
|
+
# list.
|
|
416
|
+
#
|
|
417
|
+
# Process.maxgroups #=> 32
|
|
418
|
+
#
|
|
419
|
+
def self.maxgroups: () -> Integer
|
|
420
|
+
|
|
421
|
+
# Sets the maximum number of gids allowed in the supplemental group access list.
|
|
422
|
+
#
|
|
423
|
+
def self.maxgroups=: (Integer arg0) -> Integer
|
|
424
|
+
|
|
425
|
+
# Returns the process id of this process. Not available on all platforms.
|
|
426
|
+
#
|
|
427
|
+
# Process.pid #=> 27415
|
|
428
|
+
#
|
|
429
|
+
def self.pid: () -> Integer
|
|
430
|
+
|
|
431
|
+
# Returns the process id of the parent of this process. Returns untrustworthy
|
|
432
|
+
# value on Win32/64. Not available on all platforms.
|
|
433
|
+
#
|
|
434
|
+
# puts "I am #{Process.pid}"
|
|
435
|
+
# Process.fork { puts "Dad is #{Process.ppid}" }
|
|
436
|
+
#
|
|
437
|
+
# *produces:*
|
|
438
|
+
#
|
|
439
|
+
# I am 27417
|
|
440
|
+
# Dad is 27417
|
|
441
|
+
#
|
|
442
|
+
def self.ppid: () -> Integer
|
|
443
|
+
|
|
444
|
+
# Sets the process group ID of *pid* (0 indicates this process) to *integer*.
|
|
445
|
+
# Not available on all platforms.
|
|
446
|
+
#
|
|
447
|
+
def self.setpgid: (Integer pid, Integer arg0) -> Integer
|
|
448
|
+
|
|
449
|
+
# See Process.getpriority.
|
|
450
|
+
#
|
|
451
|
+
# Process.setpriority(Process::PRIO_USER, 0, 19) #=> 0
|
|
452
|
+
# Process.setpriority(Process::PRIO_PROCESS, 0, 19) #=> 0
|
|
453
|
+
# Process.getpriority(Process::PRIO_USER, 0) #=> 19
|
|
454
|
+
# Process.getpriority(Process::PRIO_PROCESS, 0) #=> 19
|
|
455
|
+
#
|
|
456
|
+
def self.setpriority: (Integer kind, Integer arg0, Integer priority) -> Integer
|
|
457
|
+
|
|
458
|
+
# Sets the process title that appears on the ps(1) command. Not necessarily
|
|
459
|
+
# effective on all platforms. No exception will be raised regardless of the
|
|
460
|
+
# result, nor will NotImplementedError be raised even if the platform does not
|
|
461
|
+
# support the feature.
|
|
462
|
+
#
|
|
463
|
+
# Calling this method does not affect the value of $0.
|
|
464
|
+
#
|
|
465
|
+
# Process.setproctitle('myapp: worker #%d' % worker_id)
|
|
466
|
+
#
|
|
467
|
+
# This method first appeared in Ruby 2.1 to serve as a global variable free
|
|
468
|
+
# means to change the process title.
|
|
469
|
+
#
|
|
470
|
+
def self.setproctitle: (String arg0) -> String
|
|
471
|
+
|
|
472
|
+
# Sets the resource limit of the process. *cur_limit* means current (soft) limit
|
|
473
|
+
# and *max_limit* means maximum (hard) limit.
|
|
474
|
+
#
|
|
475
|
+
# If *max_limit* is not given, *cur_limit* is used.
|
|
476
|
+
#
|
|
477
|
+
# *resource* indicates the kind of resource to limit. It should be a symbol such
|
|
478
|
+
# as `:CORE`, a string such as `"CORE"` or a constant such as
|
|
479
|
+
# Process::RLIMIT_CORE. The available resources are OS dependent. Ruby may
|
|
480
|
+
# support following resources.
|
|
481
|
+
#
|
|
482
|
+
# AS
|
|
483
|
+
# : total available memory (bytes) (SUSv3, NetBSD, FreeBSD, OpenBSD but
|
|
484
|
+
# 4.4BSD-Lite)
|
|
485
|
+
# CORE
|
|
486
|
+
# : core size (bytes) (SUSv3)
|
|
487
|
+
# CPU
|
|
488
|
+
# : CPU time (seconds) (SUSv3)
|
|
489
|
+
# DATA
|
|
490
|
+
# : data segment (bytes) (SUSv3)
|
|
491
|
+
# FSIZE
|
|
492
|
+
# : file size (bytes) (SUSv3)
|
|
493
|
+
# MEMLOCK
|
|
494
|
+
# : total size for mlock(2) (bytes) (4.4BSD, GNU/Linux)
|
|
495
|
+
# MSGQUEUE
|
|
496
|
+
# : allocation for POSIX message queues (bytes) (GNU/Linux)
|
|
497
|
+
# NICE
|
|
498
|
+
# : ceiling on process's nice(2) value (number) (GNU/Linux)
|
|
499
|
+
# NOFILE
|
|
500
|
+
# : file descriptors (number) (SUSv3)
|
|
501
|
+
# NPROC
|
|
502
|
+
# : number of processes for the user (number) (4.4BSD, GNU/Linux)
|
|
503
|
+
# RSS
|
|
504
|
+
# : resident memory size (bytes) (4.2BSD, GNU/Linux)
|
|
505
|
+
# RTPRIO
|
|
506
|
+
# : ceiling on the process's real-time priority (number) (GNU/Linux)
|
|
507
|
+
# RTTIME
|
|
508
|
+
# : CPU time for real-time process (us) (GNU/Linux)
|
|
509
|
+
# SBSIZE
|
|
510
|
+
# : all socket buffers (bytes) (NetBSD, FreeBSD)
|
|
511
|
+
# SIGPENDING
|
|
512
|
+
# : number of queued signals allowed (signals) (GNU/Linux)
|
|
513
|
+
# STACK
|
|
514
|
+
# : stack size (bytes) (SUSv3)
|
|
515
|
+
#
|
|
516
|
+
#
|
|
517
|
+
# *cur_limit* and *max_limit* may be `:INFINITY`, `"INFINITY"` or
|
|
518
|
+
# Process::RLIM_INFINITY, which means that the resource is not limited. They may
|
|
519
|
+
# be Process::RLIM_SAVED_MAX, Process::RLIM_SAVED_CUR and corresponding symbols
|
|
520
|
+
# and strings too. See system setrlimit(2) manual for details.
|
|
521
|
+
#
|
|
522
|
+
# The following example raises the soft limit of core size to the hard limit to
|
|
523
|
+
# try to make core dump possible.
|
|
524
|
+
#
|
|
525
|
+
# Process.setrlimit(:CORE, Process.getrlimit(:CORE)[1])
|
|
526
|
+
#
|
|
527
|
+
def self.setrlimit: (Symbol | String | Integer resource, Integer cur_limit, ?Integer max_limit) -> nil
|
|
528
|
+
|
|
529
|
+
# Establishes this process as a new session and process group leader, with no
|
|
530
|
+
# controlling tty. Returns the session id. Not available on all platforms.
|
|
531
|
+
#
|
|
532
|
+
# Process.setsid #=> 27422
|
|
533
|
+
#
|
|
534
|
+
def self.setsid: () -> Integer
|
|
535
|
+
|
|
536
|
+
# Returns a `Tms` structure (see Process::Tms) that contains user and system CPU
|
|
537
|
+
# times for this process, and also for children processes.
|
|
538
|
+
#
|
|
539
|
+
# t = Process.times
|
|
540
|
+
# [ t.utime, t.stime, t.cutime, t.cstime ] #=> [0.0, 0.02, 0.00, 0.00]
|
|
541
|
+
#
|
|
542
|
+
def self.times: () -> Process::Tms
|
|
543
|
+
|
|
544
|
+
# Returns the (real) user ID of this process.
|
|
545
|
+
#
|
|
546
|
+
# Process.uid #=> 501
|
|
547
|
+
#
|
|
548
|
+
def self.uid: () -> Integer
|
|
549
|
+
|
|
550
|
+
# Sets the (user) user ID for this process. Not available on all platforms.
|
|
551
|
+
#
|
|
552
|
+
def self.uid=: (Integer user) -> Integer
|
|
553
|
+
|
|
554
|
+
# Waits for a child process to exit, returns its process id, and sets `$?` to a
|
|
555
|
+
# Process::Status object containing information on that process. Which child it
|
|
556
|
+
# waits on depends on the value of *pid*:
|
|
557
|
+
#
|
|
558
|
+
# > 0
|
|
559
|
+
# : Waits for the child whose process ID equals *pid*.
|
|
560
|
+
#
|
|
561
|
+
# 0
|
|
562
|
+
# : Waits for any child whose process group ID equals that of the calling
|
|
563
|
+
# process.
|
|
564
|
+
#
|
|
565
|
+
# -1
|
|
566
|
+
# : Waits for any child process (the default if no *pid* is given).
|
|
567
|
+
#
|
|
568
|
+
# < -1
|
|
569
|
+
# : Waits for any child whose process group ID equals the absolute value of
|
|
570
|
+
# *pid*.
|
|
571
|
+
#
|
|
572
|
+
#
|
|
573
|
+
# The *flags* argument may be a logical or of the flag values Process::WNOHANG
|
|
574
|
+
# (do not block if no child available) or Process::WUNTRACED (return stopped
|
|
575
|
+
# children that haven't been reported). Not all flags are available on all
|
|
576
|
+
# platforms, but a flag value of zero will work on all platforms.
|
|
577
|
+
#
|
|
578
|
+
# Calling this method raises a SystemCallError if there are no child processes.
|
|
579
|
+
# Not available on all platforms.
|
|
580
|
+
#
|
|
581
|
+
# include Process
|
|
582
|
+
# fork { exit 99 } #=> 27429
|
|
583
|
+
# wait #=> 27429
|
|
584
|
+
# $?.exitstatus #=> 99
|
|
585
|
+
#
|
|
586
|
+
# pid = fork { sleep 3 } #=> 27440
|
|
587
|
+
# Time.now #=> 2008-03-08 19:56:16 +0900
|
|
588
|
+
# waitpid(pid, Process::WNOHANG) #=> nil
|
|
589
|
+
# Time.now #=> 2008-03-08 19:56:16 +0900
|
|
590
|
+
# waitpid(pid, 0) #=> 27440
|
|
591
|
+
# Time.now #=> 2008-03-08 19:56:19 +0900
|
|
592
|
+
#
|
|
593
|
+
def self.wait: (?Integer pid, ?Integer flags) -> Integer
|
|
594
|
+
|
|
595
|
+
# Waits for a child process to exit (see Process::waitpid for exact semantics)
|
|
596
|
+
# and returns an array containing the process id and the exit status (a
|
|
597
|
+
# Process::Status object) of that child. Raises a SystemCallError if there are
|
|
598
|
+
# no child processes.
|
|
599
|
+
#
|
|
600
|
+
# Process.fork { exit 99 } #=> 27437
|
|
601
|
+
# pid, status = Process.wait2
|
|
602
|
+
# pid #=> 27437
|
|
603
|
+
# status.exitstatus #=> 99
|
|
604
|
+
#
|
|
605
|
+
def self.wait2: (?Integer pid, ?Integer flags) -> [ Integer, Process::Status ]
|
|
606
|
+
|
|
607
|
+
# Waits for all children, returning an array of *pid*/*status* pairs (where
|
|
608
|
+
# *status* is a Process::Status object).
|
|
609
|
+
#
|
|
610
|
+
# fork { sleep 0.2; exit 2 } #=> 27432
|
|
611
|
+
# fork { sleep 0.1; exit 1 } #=> 27433
|
|
612
|
+
# fork { exit 0 } #=> 27434
|
|
613
|
+
# p Process.waitall
|
|
614
|
+
#
|
|
615
|
+
# *produces*:
|
|
616
|
+
#
|
|
617
|
+
# [[30982, #<Process::Status: pid 30982 exit 0>],
|
|
618
|
+
# [30979, #<Process::Status: pid 30979 exit 1>],
|
|
619
|
+
# [30976, #<Process::Status: pid 30976 exit 2>]]
|
|
620
|
+
#
|
|
621
|
+
def self.waitall: () -> ::Array[[ Integer, Process::Status ]]
|
|
622
|
+
|
|
623
|
+
# Waits for a child process to exit, returns its process id, and sets `$?` to a
|
|
624
|
+
# Process::Status object containing information on that process. Which child it
|
|
625
|
+
# waits on depends on the value of *pid*:
|
|
626
|
+
#
|
|
627
|
+
# > 0
|
|
628
|
+
# : Waits for the child whose process ID equals *pid*.
|
|
629
|
+
#
|
|
630
|
+
# 0
|
|
631
|
+
# : Waits for any child whose process group ID equals that of the calling
|
|
632
|
+
# process.
|
|
633
|
+
#
|
|
634
|
+
# -1
|
|
635
|
+
# : Waits for any child process (the default if no *pid* is given).
|
|
636
|
+
#
|
|
637
|
+
# < -1
|
|
638
|
+
# : Waits for any child whose process group ID equals the absolute value of
|
|
639
|
+
# *pid*.
|
|
640
|
+
#
|
|
641
|
+
#
|
|
642
|
+
# The *flags* argument may be a logical or of the flag values Process::WNOHANG
|
|
643
|
+
# (do not block if no child available) or Process::WUNTRACED (return stopped
|
|
644
|
+
# children that haven't been reported). Not all flags are available on all
|
|
645
|
+
# platforms, but a flag value of zero will work on all platforms.
|
|
646
|
+
#
|
|
647
|
+
# Calling this method raises a SystemCallError if there are no child processes.
|
|
648
|
+
# Not available on all platforms.
|
|
649
|
+
#
|
|
650
|
+
# include Process
|
|
651
|
+
# fork { exit 99 } #=> 27429
|
|
652
|
+
# wait #=> 27429
|
|
653
|
+
# $?.exitstatus #=> 99
|
|
654
|
+
#
|
|
655
|
+
# pid = fork { sleep 3 } #=> 27440
|
|
656
|
+
# Time.now #=> 2008-03-08 19:56:16 +0900
|
|
657
|
+
# waitpid(pid, Process::WNOHANG) #=> nil
|
|
658
|
+
# Time.now #=> 2008-03-08 19:56:16 +0900
|
|
659
|
+
# waitpid(pid, 0) #=> 27440
|
|
660
|
+
# Time.now #=> 2008-03-08 19:56:19 +0900
|
|
661
|
+
#
|
|
662
|
+
def self.waitpid: (?Integer pid, ?Integer flags) -> Integer
|
|
663
|
+
|
|
664
|
+
# Waits for a child process to exit (see Process::waitpid for exact semantics)
|
|
665
|
+
# and returns an array containing the process id and the exit status (a
|
|
666
|
+
# Process::Status object) of that child. Raises a SystemCallError if there are
|
|
667
|
+
# no child processes.
|
|
668
|
+
#
|
|
669
|
+
# Process.fork { exit 99 } #=> 27437
|
|
670
|
+
# pid, status = Process.wait2
|
|
671
|
+
# pid #=> 27437
|
|
672
|
+
# status.exitstatus #=> 99
|
|
673
|
+
#
|
|
674
|
+
def self.waitpid2: (?Integer pid, ?Integer flags) -> [ Integer, Process::Status ]
|
|
675
|
+
end
|
|
676
|
+
|
|
677
|
+
# see Process.clock_gettime
|
|
678
|
+
#
|
|
679
|
+
#
|
|
680
|
+
Process::CLOCK_BOOTTIME: Integer
|
|
681
|
+
|
|
682
|
+
# see Process.clock_gettime
|
|
683
|
+
#
|
|
684
|
+
#
|
|
685
|
+
Process::CLOCK_BOOTTIME_ALARM: Integer
|
|
686
|
+
|
|
687
|
+
# see Process.clock_gettime
|
|
688
|
+
#
|
|
689
|
+
#
|
|
690
|
+
Process::CLOCK_MONOTONIC: Integer
|
|
691
|
+
|
|
692
|
+
# see Process.clock_gettime
|
|
693
|
+
#
|
|
694
|
+
#
|
|
695
|
+
Process::CLOCK_MONOTONIC_COARSE: Integer
|
|
696
|
+
|
|
697
|
+
# see Process.clock_gettime
|
|
698
|
+
#
|
|
699
|
+
#
|
|
700
|
+
Process::CLOCK_MONOTONIC_RAW: Integer
|
|
701
|
+
|
|
702
|
+
# see Process.clock_gettime
|
|
703
|
+
#
|
|
704
|
+
#
|
|
705
|
+
Process::CLOCK_PROCESS_CPUTIME_ID: Integer
|
|
706
|
+
|
|
707
|
+
# see Process.clock_gettime
|
|
708
|
+
#
|
|
709
|
+
#
|
|
710
|
+
Process::CLOCK_REALTIME: Integer
|
|
711
|
+
|
|
712
|
+
# see Process.clock_gettime
|
|
713
|
+
#
|
|
714
|
+
#
|
|
715
|
+
Process::CLOCK_REALTIME_ALARM: Integer
|
|
716
|
+
|
|
717
|
+
# see Process.clock_gettime
|
|
718
|
+
#
|
|
719
|
+
#
|
|
720
|
+
Process::CLOCK_REALTIME_COARSE: Integer
|
|
721
|
+
|
|
722
|
+
# see Process.clock_gettime
|
|
723
|
+
#
|
|
724
|
+
#
|
|
725
|
+
Process::CLOCK_THREAD_CPUTIME_ID: Integer
|
|
726
|
+
|
|
727
|
+
# see Process.setpriority
|
|
728
|
+
#
|
|
729
|
+
#
|
|
730
|
+
Process::PRIO_PGRP: Integer
|
|
731
|
+
|
|
732
|
+
# see Process.setpriority
|
|
733
|
+
#
|
|
734
|
+
#
|
|
735
|
+
Process::PRIO_PROCESS: Integer
|
|
736
|
+
|
|
737
|
+
# see Process.setpriority
|
|
738
|
+
#
|
|
739
|
+
#
|
|
740
|
+
Process::PRIO_USER: Integer
|
|
741
|
+
|
|
742
|
+
# Maximum size of the process's virtual memory (address space) in bytes.
|
|
743
|
+
#
|
|
744
|
+
# see the system getrlimit(2) manual for details.
|
|
745
|
+
#
|
|
746
|
+
Process::RLIMIT_AS: Integer
|
|
747
|
+
|
|
748
|
+
# Maximum size of the core file.
|
|
749
|
+
#
|
|
750
|
+
# see the system getrlimit(2) manual for details.
|
|
751
|
+
#
|
|
752
|
+
Process::RLIMIT_CORE: Integer
|
|
753
|
+
|
|
754
|
+
# CPU time limit in seconds.
|
|
755
|
+
#
|
|
756
|
+
# see the system getrlimit(2) manual for details.
|
|
757
|
+
#
|
|
758
|
+
Process::RLIMIT_CPU: Integer
|
|
759
|
+
|
|
760
|
+
# Maximum size of the process's data segment.
|
|
761
|
+
#
|
|
762
|
+
# see the system getrlimit(2) manual for details.
|
|
763
|
+
#
|
|
764
|
+
Process::RLIMIT_DATA: Integer
|
|
765
|
+
|
|
766
|
+
# Maximum size of files that the process may create.
|
|
767
|
+
#
|
|
768
|
+
# see the system getrlimit(2) manual for details.
|
|
769
|
+
#
|
|
770
|
+
Process::RLIMIT_FSIZE: Integer
|
|
771
|
+
|
|
772
|
+
# Maximum number of bytes of memory that may be locked into RAM.
|
|
773
|
+
#
|
|
774
|
+
# see the system getrlimit(2) manual for details.
|
|
775
|
+
#
|
|
776
|
+
Process::RLIMIT_MEMLOCK: Integer
|
|
777
|
+
|
|
778
|
+
# Specifies the limit on the number of bytes that can be allocated for POSIX
|
|
779
|
+
# message queues for the real user ID of the calling process.
|
|
780
|
+
#
|
|
781
|
+
# see the system getrlimit(2) manual for details.
|
|
782
|
+
#
|
|
783
|
+
Process::RLIMIT_MSGQUEUE: Integer
|
|
784
|
+
|
|
785
|
+
# Specifies a ceiling to which the process's nice value can be raised.
|
|
786
|
+
#
|
|
787
|
+
# see the system getrlimit(2) manual for details.
|
|
788
|
+
#
|
|
789
|
+
Process::RLIMIT_NICE: Integer
|
|
790
|
+
|
|
791
|
+
# Specifies a value one greater than the maximum file descriptor number that can
|
|
792
|
+
# be opened by this process.
|
|
793
|
+
#
|
|
794
|
+
# see the system getrlimit(2) manual for details.
|
|
795
|
+
#
|
|
796
|
+
Process::RLIMIT_NOFILE: Integer
|
|
797
|
+
|
|
798
|
+
# The maximum number of processes that can be created for the real user ID of
|
|
799
|
+
# the calling process.
|
|
800
|
+
#
|
|
801
|
+
# see the system getrlimit(2) manual for details.
|
|
802
|
+
#
|
|
803
|
+
Process::RLIMIT_NPROC: Integer
|
|
804
|
+
|
|
805
|
+
# Specifies the limit (in pages) of the process's resident set.
|
|
806
|
+
#
|
|
807
|
+
# see the system getrlimit(2) manual for details.
|
|
808
|
+
#
|
|
809
|
+
Process::RLIMIT_RSS: Integer
|
|
810
|
+
|
|
811
|
+
# Specifies a ceiling on the real-time priority that may be set for this
|
|
812
|
+
# process.
|
|
813
|
+
#
|
|
814
|
+
# see the system getrlimit(2) manual for details.
|
|
815
|
+
#
|
|
816
|
+
Process::RLIMIT_RTPRIO: Integer
|
|
817
|
+
|
|
818
|
+
# Specifies limit on CPU time this process scheduled under a real-time
|
|
819
|
+
# scheduling policy can consume.
|
|
820
|
+
#
|
|
821
|
+
# see the system getrlimit(2) manual for details.
|
|
822
|
+
#
|
|
823
|
+
Process::RLIMIT_RTTIME: Integer
|
|
824
|
+
|
|
825
|
+
# Specifies a limit on the number of signals that may be queued for the real
|
|
826
|
+
# user ID of the calling process.
|
|
827
|
+
#
|
|
828
|
+
# see the system getrlimit(2) manual for details.
|
|
829
|
+
#
|
|
830
|
+
Process::RLIMIT_SIGPENDING: Integer
|
|
831
|
+
|
|
832
|
+
# Maximum size of the stack, in bytes.
|
|
833
|
+
#
|
|
834
|
+
# see the system getrlimit(2) manual for details.
|
|
835
|
+
#
|
|
836
|
+
Process::RLIMIT_STACK: Integer
|
|
837
|
+
|
|
838
|
+
# see Process.setrlimit
|
|
839
|
+
#
|
|
840
|
+
#
|
|
841
|
+
Process::RLIM_INFINITY: Integer
|
|
842
|
+
|
|
843
|
+
# see Process.setrlimit
|
|
844
|
+
#
|
|
845
|
+
#
|
|
846
|
+
Process::RLIM_SAVED_CUR: Integer
|
|
847
|
+
|
|
848
|
+
# see Process.setrlimit
|
|
849
|
+
#
|
|
850
|
+
#
|
|
851
|
+
Process::RLIM_SAVED_MAX: Integer
|
|
852
|
+
|
|
853
|
+
# see Process.wait
|
|
854
|
+
#
|
|
855
|
+
#
|
|
856
|
+
Process::WNOHANG: Integer
|
|
857
|
+
|
|
858
|
+
# see Process.wait
|
|
859
|
+
#
|
|
860
|
+
#
|
|
861
|
+
Process::WUNTRACED: Integer
|
|
862
|
+
|
|
863
|
+
# The Process::GID module contains a collection of module functions which can be
|
|
864
|
+
# used to portably get, set, and switch the current process's real, effective,
|
|
865
|
+
# and saved group IDs.
|
|
866
|
+
#
|
|
867
|
+
module Process::GID
|
|
868
|
+
# Change the current process's real and effective group ID to that specified by
|
|
869
|
+
# *group*. Returns the new group ID. Not available on all platforms.
|
|
870
|
+
#
|
|
871
|
+
# [Process.gid, Process.egid] #=> [0, 0]
|
|
872
|
+
# Process::GID.change_privilege(33) #=> 33
|
|
873
|
+
# [Process.gid, Process.egid] #=> [33, 33]
|
|
874
|
+
#
|
|
875
|
+
def self.change_privilege: (Integer group) -> Integer
|
|
876
|
+
|
|
877
|
+
# Returns the effective group ID for this process. Not available on all
|
|
878
|
+
# platforms.
|
|
879
|
+
#
|
|
880
|
+
# Process.egid #=> 500
|
|
881
|
+
#
|
|
882
|
+
def self.eid: () -> Integer
|
|
883
|
+
|
|
884
|
+
# Get the group ID by the *name*. If the group is not found, `ArgumentError`
|
|
885
|
+
# will be raised.
|
|
886
|
+
#
|
|
887
|
+
# Process::GID.from_name("wheel") #=> 0
|
|
888
|
+
# Process::GID.from_name("nosuchgroup") #=> can't find group for nosuchgroup (ArgumentError)
|
|
889
|
+
#
|
|
890
|
+
def self.from_name: (String name) -> Integer
|
|
891
|
+
|
|
892
|
+
# Set the effective group ID, and if possible, the saved group ID of the process
|
|
893
|
+
# to the given *group*. Returns the new effective group ID. Not available on all
|
|
894
|
+
# platforms.
|
|
895
|
+
#
|
|
896
|
+
# [Process.gid, Process.egid] #=> [0, 0]
|
|
897
|
+
# Process::GID.grant_privilege(31) #=> 33
|
|
898
|
+
# [Process.gid, Process.egid] #=> [0, 33]
|
|
899
|
+
#
|
|
900
|
+
def self.grant_privilege: (Integer group) -> Integer
|
|
901
|
+
|
|
902
|
+
# Exchange real and effective group IDs and return the new effective group ID.
|
|
903
|
+
# Not available on all platforms.
|
|
904
|
+
#
|
|
905
|
+
# [Process.gid, Process.egid] #=> [0, 33]
|
|
906
|
+
# Process::GID.re_exchange #=> 0
|
|
907
|
+
# [Process.gid, Process.egid] #=> [33, 0]
|
|
908
|
+
#
|
|
909
|
+
def self.re_exchange: () -> Integer
|
|
910
|
+
|
|
911
|
+
# Returns `true` if the real and effective group IDs of a process may be
|
|
912
|
+
# exchanged on the current platform.
|
|
913
|
+
#
|
|
914
|
+
def self.re_exchangeable?: () -> bool
|
|
915
|
+
|
|
916
|
+
# Returns the (real) group ID for this process.
|
|
917
|
+
#
|
|
918
|
+
# Process.gid #=> 500
|
|
919
|
+
#
|
|
920
|
+
def self.rid: () -> Integer
|
|
921
|
+
|
|
922
|
+
# Returns `true` if the current platform has saved group ID functionality.
|
|
923
|
+
#
|
|
924
|
+
def self.sid_available?: () -> bool
|
|
925
|
+
|
|
926
|
+
# Switch the effective and real group IDs of the current process. If a *block*
|
|
927
|
+
# is given, the group IDs will be switched back after the block is executed.
|
|
928
|
+
# Returns the new effective group ID if called without a block, and the return
|
|
929
|
+
# value of the block if one is given.
|
|
930
|
+
#
|
|
931
|
+
def self.switch: () -> Integer
|
|
932
|
+
| [T] () { () -> T } -> T
|
|
933
|
+
|
|
934
|
+
def self.eid=: (Integer group) -> Integer
|
|
935
|
+
end
|
|
936
|
+
|
|
937
|
+
# Process::Status encapsulates the information on the status of a running or
|
|
938
|
+
# terminated system process. The built-in variable `$?` is either `nil` or a
|
|
939
|
+
# Process::Status object.
|
|
940
|
+
#
|
|
941
|
+
# fork { exit 99 } #=> 26557
|
|
942
|
+
# Process.wait #=> 26557
|
|
943
|
+
# $?.class #=> Process::Status
|
|
944
|
+
# $?.to_i #=> 25344
|
|
945
|
+
# $? >> 8 #=> 99
|
|
946
|
+
# $?.stopped? #=> false
|
|
947
|
+
# $?.exited? #=> true
|
|
948
|
+
# $?.exitstatus #=> 99
|
|
949
|
+
#
|
|
950
|
+
# Posix systems record information on processes using a 16-bit integer. The
|
|
951
|
+
# lower bits record the process status (stopped, exited, signaled) and the upper
|
|
952
|
+
# bits possibly contain additional information (for example the program's return
|
|
953
|
+
# code in the case of exited processes). Pre Ruby 1.8, these bits were exposed
|
|
954
|
+
# directly to the Ruby program. Ruby now encapsulates these in a Process::Status
|
|
955
|
+
# object. To maximize compatibility, however, these objects retain a
|
|
956
|
+
# bit-oriented interface. In the descriptions that follow, when we talk about
|
|
957
|
+
# the integer value of *stat*, we're referring to this 16 bit value.
|
|
958
|
+
#
|
|
959
|
+
class Process::Status < Object
|
|
960
|
+
# Logical AND of the bits in *stat* with *num*.
|
|
961
|
+
#
|
|
962
|
+
# fork { exit 0x37 }
|
|
963
|
+
# Process.wait
|
|
964
|
+
# sprintf('%04x', $?.to_i) #=> "3700"
|
|
965
|
+
# sprintf('%04x', $? & 0x1e00) #=> "1600"
|
|
966
|
+
#
|
|
967
|
+
def &: (Integer num) -> Integer
|
|
968
|
+
|
|
969
|
+
# Returns `true` if the integer value of *stat* equals *other*.
|
|
970
|
+
#
|
|
971
|
+
def ==: (untyped other) -> bool
|
|
972
|
+
|
|
973
|
+
# Shift the bits in *stat* right *num* places.
|
|
974
|
+
#
|
|
975
|
+
# fork { exit 99 } #=> 26563
|
|
976
|
+
# Process.wait #=> 26563
|
|
977
|
+
# $?.to_i #=> 25344
|
|
978
|
+
# $? >> 8 #=> 99
|
|
979
|
+
#
|
|
980
|
+
def >>: (Integer num) -> Integer
|
|
981
|
+
|
|
982
|
+
# Returns `true` if *stat* generated a coredump when it terminated. Not
|
|
983
|
+
# available on all platforms.
|
|
984
|
+
#
|
|
985
|
+
def coredump?: () -> bool
|
|
986
|
+
|
|
987
|
+
# Returns `true` if *stat* exited normally (for example using an `exit()` call
|
|
988
|
+
# or finishing the program).
|
|
989
|
+
#
|
|
990
|
+
def exited?: () -> bool
|
|
991
|
+
|
|
992
|
+
# Returns the least significant eight bits of the return code of *stat*. Only
|
|
993
|
+
# available if #exited? is `true`.
|
|
994
|
+
#
|
|
995
|
+
# fork { } #=> 26572
|
|
996
|
+
# Process.wait #=> 26572
|
|
997
|
+
# $?.exited? #=> true
|
|
998
|
+
# $?.exitstatus #=> 0
|
|
999
|
+
#
|
|
1000
|
+
# fork { exit 99 } #=> 26573
|
|
1001
|
+
# Process.wait #=> 26573
|
|
1002
|
+
# $?.exited? #=> true
|
|
1003
|
+
# $?.exitstatus #=> 99
|
|
1004
|
+
#
|
|
1005
|
+
def exitstatus: () -> Integer?
|
|
1006
|
+
|
|
1007
|
+
# Override the inspection method.
|
|
1008
|
+
#
|
|
1009
|
+
# system("false")
|
|
1010
|
+
# p $?.inspect #=> "#<Process::Status: pid 12861 exit 1>"
|
|
1011
|
+
#
|
|
1012
|
+
def inspect: () -> String
|
|
1013
|
+
|
|
1014
|
+
# Returns the process ID that this status object represents.
|
|
1015
|
+
#
|
|
1016
|
+
# fork { exit } #=> 26569
|
|
1017
|
+
# Process.wait #=> 26569
|
|
1018
|
+
# $?.pid #=> 26569
|
|
1019
|
+
#
|
|
1020
|
+
def pid: () -> Integer
|
|
1021
|
+
|
|
1022
|
+
# Returns `true` if *stat* terminated because of an uncaught signal.
|
|
1023
|
+
#
|
|
1024
|
+
def signaled?: () -> bool
|
|
1025
|
+
|
|
1026
|
+
# Returns `true` if this process is stopped. This is only returned if the
|
|
1027
|
+
# corresponding #wait call had the Process::WUNTRACED flag set.
|
|
1028
|
+
#
|
|
1029
|
+
def stopped?: () -> bool
|
|
1030
|
+
|
|
1031
|
+
# Returns the number of the signal that caused *stat* to stop (or `nil` if self
|
|
1032
|
+
# is not stopped).
|
|
1033
|
+
#
|
|
1034
|
+
def stopsig: () -> Integer?
|
|
1035
|
+
|
|
1036
|
+
# Returns `true` if *stat* is successful, `false` if not. Returns `nil` if
|
|
1037
|
+
# #exited? is not `true`.
|
|
1038
|
+
#
|
|
1039
|
+
def success?: () -> bool
|
|
1040
|
+
|
|
1041
|
+
# Returns the number of the signal that caused *stat* to terminate (or `nil` if
|
|
1042
|
+
# self was not terminated by an uncaught signal).
|
|
1043
|
+
#
|
|
1044
|
+
def termsig: () -> Integer?
|
|
1045
|
+
|
|
1046
|
+
# Returns the bits in *stat* as a Integer. Poking around in these bits is
|
|
1047
|
+
# platform dependent.
|
|
1048
|
+
#
|
|
1049
|
+
# fork { exit 0xab } #=> 26566
|
|
1050
|
+
# Process.wait #=> 26566
|
|
1051
|
+
# sprintf('%04x', $?.to_i) #=> "ab00"
|
|
1052
|
+
#
|
|
1053
|
+
def to_i: () -> Integer
|
|
1054
|
+
|
|
1055
|
+
# Show pid and exit status as a string.
|
|
1056
|
+
#
|
|
1057
|
+
# system("false")
|
|
1058
|
+
# p $?.to_s #=> "pid 12766 exit 1"
|
|
1059
|
+
#
|
|
1060
|
+
def to_s: () -> String
|
|
1061
|
+
end
|
|
1062
|
+
|
|
1063
|
+
# The Process::Sys module contains UID and GID functions which provide direct
|
|
1064
|
+
# bindings to the system calls of the same names instead of the more-portable
|
|
1065
|
+
# versions of the same functionality found in the Process, Process::UID, and
|
|
1066
|
+
# Process::GID modules.
|
|
1067
|
+
#
|
|
1068
|
+
module Process::Sys
|
|
1069
|
+
# Returns the effective user ID for this process.
|
|
1070
|
+
#
|
|
1071
|
+
# Process.euid #=> 501
|
|
1072
|
+
#
|
|
1073
|
+
def self.geteuid: () -> Integer
|
|
1074
|
+
|
|
1075
|
+
# Returns the (real) group ID for this process.
|
|
1076
|
+
#
|
|
1077
|
+
# Process.gid #=> 500
|
|
1078
|
+
#
|
|
1079
|
+
def self.getgid: () -> Integer
|
|
1080
|
+
|
|
1081
|
+
# Returns the (real) user ID of this process.
|
|
1082
|
+
#
|
|
1083
|
+
# Process.uid #=> 501
|
|
1084
|
+
#
|
|
1085
|
+
def self.getuid: () -> Integer
|
|
1086
|
+
|
|
1087
|
+
# Returns `true` if the process was created as a result of an execve(2) system
|
|
1088
|
+
# call which had either of the setuid or setgid bits set (and extra privileges
|
|
1089
|
+
# were given as a result) or if it has changed any of its real, effective or
|
|
1090
|
+
# saved user or group IDs since it began execution.
|
|
1091
|
+
#
|
|
1092
|
+
def self.issetugid: () -> bool
|
|
1093
|
+
|
|
1094
|
+
# Set the effective group ID of the calling process to *group*. Not available
|
|
1095
|
+
# on all platforms.
|
|
1096
|
+
#
|
|
1097
|
+
def self.setegid: (Integer group) -> nil
|
|
1098
|
+
|
|
1099
|
+
# Set the effective user ID of the calling process to *user*. Not available on
|
|
1100
|
+
# all platforms.
|
|
1101
|
+
#
|
|
1102
|
+
def self.seteuid: (Integer user) -> nil
|
|
1103
|
+
|
|
1104
|
+
# Set the group ID of the current process to *group*. Not available on all
|
|
1105
|
+
# platforms.
|
|
1106
|
+
#
|
|
1107
|
+
def self.setgid: (Integer group) -> nil
|
|
1108
|
+
|
|
1109
|
+
# Sets the (group) real and/or effective group IDs of the current process to
|
|
1110
|
+
# *rid* and *eid*, respectively. A value of `-1` for either means to leave that
|
|
1111
|
+
# ID unchanged. Not available on all platforms.
|
|
1112
|
+
#
|
|
1113
|
+
def self.setregid: (Integer rid, Integer eid) -> nil
|
|
1114
|
+
|
|
1115
|
+
# Sets the (group) real, effective, and saved user IDs of the current process to
|
|
1116
|
+
# *rid*, *eid*, and *sid* respectively. A value of `-1` for any value means to
|
|
1117
|
+
# leave that ID unchanged. Not available on all platforms.
|
|
1118
|
+
#
|
|
1119
|
+
def self.setresgid: (Integer rid, Integer eid, Integer sid) -> nil
|
|
1120
|
+
|
|
1121
|
+
# Sets the (user) real, effective, and saved user IDs of the current process to
|
|
1122
|
+
# *rid*, *eid*, and *sid* respectively. A value of `-1` for any value means to
|
|
1123
|
+
# leave that ID unchanged. Not available on all platforms.
|
|
1124
|
+
#
|
|
1125
|
+
def self.setresuid: (Integer rid, Integer eid, Integer sid) -> nil
|
|
1126
|
+
|
|
1127
|
+
# Sets the (user) real and/or effective user IDs of the current process to *rid*
|
|
1128
|
+
# and *eid*, respectively. A value of `-1` for either means to leave that ID
|
|
1129
|
+
# unchanged. Not available on all platforms.
|
|
1130
|
+
#
|
|
1131
|
+
def self.setreuid: (Integer rid, Integer eid) -> nil
|
|
1132
|
+
|
|
1133
|
+
# Set the real group ID of the calling process to *group*. Not available on all
|
|
1134
|
+
# platforms.
|
|
1135
|
+
#
|
|
1136
|
+
def self.setrgid: (Integer group) -> nil
|
|
1137
|
+
|
|
1138
|
+
# Set the real user ID of the calling process to *user*. Not available on all
|
|
1139
|
+
# platforms.
|
|
1140
|
+
#
|
|
1141
|
+
def self.setruid: (Integer user) -> nil
|
|
1142
|
+
|
|
1143
|
+
# Set the user ID of the current process to *user*. Not available on all
|
|
1144
|
+
# platforms.
|
|
1145
|
+
#
|
|
1146
|
+
def self.setuid: (Integer user) -> nil
|
|
1147
|
+
end
|
|
1148
|
+
|
|
1149
|
+
# The Process::UID module contains a collection of module functions which can be
|
|
1150
|
+
# used to portably get, set, and switch the current process's real, effective,
|
|
1151
|
+
# and saved user IDs.
|
|
1152
|
+
#
|
|
1153
|
+
module Process::UID
|
|
1154
|
+
# Change the current process's real and effective user ID to that specified by
|
|
1155
|
+
# *user*. Returns the new user ID. Not available on all platforms.
|
|
1156
|
+
#
|
|
1157
|
+
# [Process.uid, Process.euid] #=> [0, 0]
|
|
1158
|
+
# Process::UID.change_privilege(31) #=> 31
|
|
1159
|
+
# [Process.uid, Process.euid] #=> [31, 31]
|
|
1160
|
+
#
|
|
1161
|
+
def self.change_privilege: (Integer user) -> Integer
|
|
1162
|
+
|
|
1163
|
+
# Returns the effective user ID for this process.
|
|
1164
|
+
#
|
|
1165
|
+
# Process.euid #=> 501
|
|
1166
|
+
#
|
|
1167
|
+
def self.eid: () -> Integer
|
|
1168
|
+
|
|
1169
|
+
# Get the user ID by the *name*. If the user is not found, `ArgumentError` will
|
|
1170
|
+
# be raised.
|
|
1171
|
+
#
|
|
1172
|
+
# Process::UID.from_name("root") #=> 0
|
|
1173
|
+
# Process::UID.from_name("nosuchuser") #=> can't find user for nosuchuser (ArgumentError)
|
|
1174
|
+
#
|
|
1175
|
+
def self.from_name: (String name) -> Integer
|
|
1176
|
+
|
|
1177
|
+
# Set the effective user ID, and if possible, the saved user ID of the process
|
|
1178
|
+
# to the given *user*. Returns the new effective user ID. Not available on all
|
|
1179
|
+
# platforms.
|
|
1180
|
+
#
|
|
1181
|
+
# [Process.uid, Process.euid] #=> [0, 0]
|
|
1182
|
+
# Process::UID.grant_privilege(31) #=> 31
|
|
1183
|
+
# [Process.uid, Process.euid] #=> [0, 31]
|
|
1184
|
+
#
|
|
1185
|
+
def self.grant_privilege: (Integer user) -> Integer
|
|
1186
|
+
|
|
1187
|
+
# Exchange real and effective user IDs and return the new effective user ID. Not
|
|
1188
|
+
# available on all platforms.
|
|
1189
|
+
#
|
|
1190
|
+
# [Process.uid, Process.euid] #=> [0, 31]
|
|
1191
|
+
# Process::UID.re_exchange #=> 0
|
|
1192
|
+
# [Process.uid, Process.euid] #=> [31, 0]
|
|
1193
|
+
#
|
|
1194
|
+
def self.re_exchange: () -> Integer
|
|
1195
|
+
|
|
1196
|
+
# Returns `true` if the real and effective user IDs of a process may be
|
|
1197
|
+
# exchanged on the current platform.
|
|
1198
|
+
#
|
|
1199
|
+
def self.re_exchangeable?: () -> bool
|
|
1200
|
+
|
|
1201
|
+
# Returns the (real) user ID of this process.
|
|
1202
|
+
#
|
|
1203
|
+
# Process.uid #=> 501
|
|
1204
|
+
#
|
|
1205
|
+
def self.rid: () -> Integer
|
|
1206
|
+
|
|
1207
|
+
# Returns `true` if the current platform has saved user ID functionality.
|
|
1208
|
+
#
|
|
1209
|
+
def self.sid_available?: () -> bool
|
|
1210
|
+
|
|
1211
|
+
# Switch the effective and real user IDs of the current process. If a *block* is
|
|
1212
|
+
# given, the user IDs will be switched back after the block is executed. Returns
|
|
1213
|
+
# the new effective user ID if called without a block, and the return value of
|
|
1214
|
+
# the block if one is given.
|
|
1215
|
+
#
|
|
1216
|
+
def self.switch: () -> Integer
|
|
1217
|
+
| [T] () { () -> T } -> T
|
|
1218
|
+
|
|
1219
|
+
def self.eid=: (Integer user) -> Integer
|
|
1220
|
+
end
|
|
1221
|
+
|
|
1222
|
+
class Process::Tms < Struct[Float]
|
|
1223
|
+
end
|
|
1224
|
+
|
|
1225
|
+
class Process::Waiter < Thread
|
|
1226
|
+
def pid: () -> Integer
|
|
1227
|
+
end
|