Ruby 4.0 リファレンスマニュアル

module function Process::GID?.switch

switch -> Integer[permalink][rdoc][edit]
switch {...} -> object
() → Integer
[T] () { () → T } → T

実効グループ ID を一時的に変更するために使います。

実効グループ ID を実グループ ID に変更します。実効グループ ID と実グループ ID が等しい場合には、実効グループ ID を保存グループ ID に変更します。変更前の実効グループ ID を返します。

ブロックが指定された場合、実効グループ ID を実グループ ID へ変更しブロックを実行します。ブロック終了時に実効グループ ID を元の値に戻します。ブロックの実行結果を返します。

なお、保存グループ ID を持たない環境でこのメソッドを実行すると実グループ ID が変化します。

[EXCEPTION] Errno::EPERM:
各グループ ID がこのメソッドを実行するのに適切な状態でない場合、つまり、実グループ ID・実効グループ ID・保存グループ ID が全て同じ場合に発生します。ブロック付きの場合は、なんらかの原因で元の権限に復帰できないにも発生します。ブロック内でグループ ID が変更されたなどの理由が挙げられます。
[EXCEPTION] NotImplementedError:
メソッドが現在のプラットフォームで実装されていない場合に発生します。
include Process
# (r, e, s) == (500, 505, 505)
p [gid, egid]           # => [500, 505]
Process::GID.switch do
  p [gid, egid]         # => [500, 500]
end
p [gid, egid]           # => [500, 505]