参考手册:标准库——内部模块

为具有精度的具体值类准备的 Mix-in. 这里所说的精度是指实数的近似性. 因此,最好不要用在诸如抽象值类,复数以及矩阵这些不能归入实数的类中.
模块方法:

Precision.included(module_or_class)

  ruby 1.7 feature

  若Precision被include, 则调用本方法. 详情请参考Module#included.

  该方法主要是为了在那些包含Precision的类和模块中自动定义induced_from方法而准备的.
Precision.induced_from(number)

  将number变为自己的类后返回结果. 在使用默认定义的情况下, 会引发TypeError异常, 因此必须在进行Mix-in的类中对该方法进行重新定义. 若在重新定义的过程中使用了Precision#prec的话, 可能会造成无限循环.

方法:

prec(klass)

  将self的精度变为klass并返回结果. 在使用默认定义的情况下, 会调用klass.induced_from(self), 并返回其结果.

  生成新精度类时, 不要修改内部类的Precision.induced_from, 而应该对这个prec进行重新定义 .
prec_i

  将self变为Integer. 相当于prec(Integer).
prec_f

  将self变为Float. 相当于prec(Float).
理UNIX进程的模块.

请注意, Process并不是用来显示进程的类, 而是囊括了进程操作方法的模块.
模块方法:

Process.abort([message])

  ruby 1.7 特性

  与abort函数相同 。
Process.daemon(nochdir=nil,noclose=nil)

  ruby 1.9 特性

  将控制终端从进程中剥离出来, 将进程转到后台并以deamon方式运行.

  将当前目录转移到 / . 若nochdir为真,则不进行该操作, 即不转移当前目录 .

  将标准输入,标准输出,标准错误输出重定向到 /dev/nul. 若noclose为真, 则不进行该操作, 即不进行重定向.

  返回0.
Process.detach(pid)

  ruby 1.8 特性

  生成并返回一个用来监视子进程pid结束情况的线程. 当子进程结束时, 该线程也将结束并返回nil. (若指定的子进程并不存在时, 该线程会立刻结束并返回nil).

  pid = fork {
  # child
  sleep 3
  }

  th = Process.detach(pid)
  p th.value

  # => nil

Process.exit([status])

  ruby 1.7 特性

  等同于exit函数 。
Process.exit!([status])

  等同于exit!函数 。
Process.fork
Process.fork { ... }

  等同于fork函数 。
Process.spawn(cmd, [, arg, ...]) ((<ruby 1.9 特性>))

  等同于spawn函数 。

模块属性:

以下这些是模块函数。

Process.egid

  返回当前进程的有效group ID 。
Process.egid=gid

  设定当前进程的有效group ID。返回gid 。
Process.euid

  返回当前进程的有效用户ID 。
Process.euid=uid

  设定当前进程的有效用户ID。返回uid 。
Process.gid

  返回当前进程的实group ID 。
Process.gid=gid

  设定当前进程的实group ID。返回gid 。
Process.groups

  返回辅助group ID的数组(可能包括有效group ID)。

  返回数组中最多可包含32个元素(这可能是个bug)。
Process.groups=gid_ary

  设定辅助group。右边数组中的元素可以是group ID或group名。返回Process.groups的结果。

  若所设定的辅助group ID的个数超过Process.maxgroups的值时, 将引发ArgumentError异常。
Process.maxgroups
Process.maxgroups=num

  设定辅助group ID的最大可用数。 若设定值小于实际返回的辅助group ID的值时, 将在Process.groups中引发异常。
Process.pid

  返回当前进程的进程ID 。其值与变量$$的值相同。
Process.ppid

  返回父进程的进程ID 。在UN*X中,若实际的父进程终止后, ppid的值会变为1 (init的pid)。
Process.uid

  返回进程的实用户ID 。
Process.uid=uid

  设定进程的实用户ID 。返回uid 。

模块函数:

Process.getpgid(pid)
Process.getpgrp([pid])

  返回进程pid的进程组。若pid为0或被省略, 则意味着当前进程。

  若未能成功取得进程组, 则引发Errno::EXXX异常。
Process.getpriority(which, who)

  返回进程、进程组、用户的当前优先级(请参考getpriority(2))。

  Process 模块中定义了下列可供which使用的常数RIO_PROCESS, PRIO_PGRP, PRIO_USER。

  who则按照which的不同来分别指定进程ID、进程组ID或用户ID。

  若未能成功获取优先级,则引发Errno::EXXX异常。
Process.initgroups(user, group)

  招募撰稿人

  (请参考initgroups(3))
Process.kill(signal, pid ... )

  向pid所指进程发送信号。signal可以是信号编号或名称(字符串或Symbol)。若信号是负值(或信号名称前面带有-时), 则向进程组而非进程发送信号。

  若所有信号都被成功发送时, 返回指定的pid的值。若失败的话,引发Errno::EXXX异常。

  若指定了并不存在的信号时, 引发ArgumentError异常。

  另外请参考trap
Process.setpgrp(pid, pgrp)
Process.setpgrp ((<ruby 1.7 特性>))
Process.setpgid(pid, pgrp)

  设定pid的进程组。若pid为0则意味着当前进程。

  若成功设定进程组则返回0 。若失败则引发Errno::EXXX异常。

  ruby 1.7 特性: 在1.7版本中, Process.setpgrp不带参数。
Process.setpriority(which, who, prio)

  设定进程、进程组、用户的当前优先级(请参考setpriority(2))。

  Process 模块中定义了下列可供which使用的常数RIO_PROCESS, PRIO_PGRP, PRIO_USER。

  who则按照which的不同来分别指定进程ID、进程组ID或用户ID。

  prio的取值范围是-20到20。

  若成功设定优先级则返回0 。若失败则引发Errno::EXXX异常。
Process.setsid()

  生成新的session,并剥离tty。可方便地生成deamon。返回session ID 。

  若未能成功生成session ID , 则引发Errno::EXXX异常。
Process.times ((<ruby 1.7 特性>))

  以Struct::Tms对象的形式返回自身进程及其子进程所消耗的用户/系统CPU时间的累计值。Struct::Tms是个结构体,其成员如下。

  utime    # user time
  stime    # system time
  cutime    # user time of children
  cstime    # system time of children

  时间单位为秒, 以浮点数的形式给出. 详情请参考times(3) 。
Process.wait
Process.wait2

  等待子进程的终结,并返回结束的子进程的pid 。若没有任何的子进程时, 引发Errno::ECHILD异常。

  wait2的不同之处在于, 它的返回值是由pid和$?所构成的数组。

  ruby 1.7 特性: 从1.7版本开始, $?变为Process::Status对象。
Process.waitall ((<ruby 1.7 特性>))

  等待所有子进程的终结。

  它返回一个数组, 数组元素由已终结的子进程的pid和结束状态值(Process::Status)的数组所构成。 若在没有子进程的状态下调用该方法时,将返回空数组。

  $?中保存的是最后一个结束的子进程的结束状态值。

  例:

  3.times {|n|
  Process.fork() { exit n }
  }
  p ret = Process.waitall
  p ret[-1][1] , ret[-1][1].type
  p $?    , $?.type
  => [[5245, 256], [5244, 0], [5243, 512]]
   512
   Process::Status
   512
   Process::Status

Process.waitpid(pid[, flags])
Process.waitpid2(pid[, flags])

  等待pid所指的那个子进程的终结, 该子进程结束时返回pid 。若不存在该子进程, 则引发Errno::ECHILD异常。

  flags中可选用Process模块的WNOHANG常数(不阻塞模式)和WUNTRACED常数。省略时的默认值为0。

  在不阻塞模式下, 当子进程尚未终结时返回nil 。在那些未安装waitpid(2)或wait4(2)的系统中, 必须将flags指定为nil或0。

  waitpid2的不同之处在于, 其返回值是由pid和$?所构成的数组。

  ruby 1.7 特性: 从1.7版本开始, $?变为Process::Status对象。

常数:

PRIO_PROCESS

  Process.getpriority或Process.setpriority中的进程优先级。
PRIO_PGRP

  进程组优先级。
PRIO_USER

  用户优先级。
WNOHANG

  Process#waitpid的第二参数中所用的标识。若没有已结束的子进程时, waitpid不会进入阻塞状态。
WUNTRACED

  Process#waitpid的第二参数中所用的标识。若某子进程因挂起而不能报告状态值时, waitpid不会进入阻塞状态。

内部类:

Status ((<ruby 1.7 特性>))

  显示进程结束状态值的类。请参考Process::Status 。

内部模块:

UID ((<ruby 1.8 特性>))
GID ((<ruby 1.8 特性>))
Sys ((<ruby 1.8 特性>))

  该模块囊括了对进程的用户/组 属性进行操作的方法。UID和GID模块超越了各种Unix系统间的差异,提供了统一的接口。

  Sys模块提供了相当于系统调用的各种方法。

  请分别参考Process::UID, Process::GID, Process::Sys 。
该模块囊括了那些对组ID进行操作的方法.

其中定义了与Process::UID一样的方法。
与Process::UID以及Process::GID不同的是,该模块囊括了那些用来操作用户ID、组ID的系统调用。
模块函数

getuid

  返回进程的实用户 ID 。等同于C语言中的getuid() 。
geteuid

  返回进程的有效用户 ID 。等同于C语言中的geteuid() 。
getgid

  返回进程的实组 ID 。等同于C语言中的getguid() 。
getegid

  返回进程的有效组 ID 。等同于C语言中的getegid() 。
setuid(id)

  等同于C语言中的setuid() 。
setgid(id)

  等同于C语言中的setgid() 。
setruid(id)

  等同于C语言中的setgid() 。
setrgid(id)

  等同于C语言中的setgid() 。
seteuid(id)

  等同于C语言中的seteuid() 。
setegid(id)

  等同于C语言中的setegid() 。
setreuid(rid, eid)

  等同于C语言中的setreuid() 。
setregid(rid, eid)

  等同于C语言中的setregid() 。
setresuid(rid, eid, sid)

  等同于C语言中的setresuid() 。
setresgid(rid, eid, sid)

  等同于C语言中的setresgid() 。
issetugid

  若启动进程时使用了setuid或setgid位的话,就返回真。
该模块囊括了那些对用户ID进行操作的方法. 其中定义了与Process::GID一样的方法.
模块函数

rid

  返回当前的实用户 ID 。
eid

  返回当前的有效用户 ID 。
change_privilege(id)

  放弃实用户 ID, 有效用户 ID和保存用户 ID后,切换为其他用户. 若切换成功则返回id.

  若未能进行彻底切换(无法变更部分用户ID)时,会引发ArgumentError异常. 若出现异常, 则无法保证调用该方法之前的各用户ID已被正确保存.

  请注意,该方法无法兼容Process.uid=. 若您使用了setreuid(id,-1)的话, 则必须像下面这样进行改写.

  Process::UID.re_exchange # (r,e,s)==(u1,u2,??) ==> (u2,u1,??)
  Process::UID.eid = id  # (u2,u1,??) ==> (u2,id,??)
  Process::UID.re_exchange # (u2,id,??) ==> (id,u2,??)

grant_privilege(id)
eid=(id)

  修改有效用户 ID. 若成功则返回id.

  至于保存用户 ID是否会发生变化要看Process::UID.re_exchangeable?能否返回true而定. 若re_exchangeable?为false, 则保存用户 ID不会发生变化. 若为true,且其值有别与实用户ID的话, 将使用新的有效用户ID的值来设定保存用户ID.

  若不能进行设定的话, 就会引发 Errno::EPERM 异常.
re_exchange

  将实用户 ID 和有效用户 ID 进行对调. 保存用户 ID的值会与有效用户 ID保持一致. 若系统所需资源尚未安装完全时, 将引发异常.

  返回新的有效用户 ID 。
re_exchangeable?

  返回一个布尔值,以此表示当前环境中能否(Process::UID.re_exchange是否已安装)对实用户 ID 和有效用户 ID进行对调. 若可以对调则返回true.
sid_available?

  返回一个布尔值, 以此表示当前环境中的保存用户ID是否可用. 若可用的话就返回true. 但我们无法保证该方法的可靠性. 只要满足下列条件之一, 即认定保存用户 ID是可用的.

   * 有setresuid()
   * 有seteuid()
   * _POSIX_SAVED_IDS 被定义为真

switch
switch { .... }

  暂时修改用户权限.

  若该方法不带块的话, 则每次调用时,都会把有效用户ID变为实用户ID或保存用户ID. 其结果是如果您两次调用该方法的话,则只有两次调用间的有效用户ID才会被变为实用户ID.

  若带块调用的话, 会将有效用户ID变为实用户ID, 在执行了块的内容之后,再将有效用户ID恢复为原来的值.

  不带块时返回可复原(可更改)ID. 带块调用时返回块的计算值.

  若调用该方法时, 各用户ID的状态不符合要求, 即实用户ID,有效用户ID和保存用户ID三者相同时, 会引发Errno::EPERM 异常. 另外, 若当前环境中尚未安装该方法时, 会引发NotImplementedError异常.

  带块调用时, 若由于某些原因导致无法恢复到原有权限时, 将引发 Errno::EPERM 异常. 比如说,若块的内部对用户ID进行了改动的话就会出现这种情况.

  另外, 若在那些保存用户ID不可用的环境中调用该方法的话,实用户ID就会发生变化.
ruby 1.7 特性

该模块负责执行UNIX信号的相关操作.
模块函数:

Signal.list

  ruby 1.8 特性:

  返回一个Hash对象,它将信号名称与信号号码一一对应起来.

  p Signal.list # => {"WINCH"=>28, "PROF"=>27, ...}

Signal.trap(signal, command)
Signal.trap(signal) { ... }

  ruby 1.8 特性:

  它将command注册为中断信号signal的处理程序. signal可以是信号名称字符串,Symbol或信号号码. 还可以使用诸如0或"EXIT"这样的特殊值. 它表示"程序结束时".

  command可以是字符串或块. 若将其指定为nil、空字符串""、"SIG_IGN"或者"IGNORE"的话, 则会尽可能地忽略信号. 若指定为"SIG_DFL"或者"DEFAULT"时, 将使用默认的信号处理程序. 若指定为"EXIT"时, 在收到信号后将会进行结束时的相关处理, 然后以状态值0来结束程序.

  若遇到若干个信号时, Ruby解释器会引发Interrupt或SignalException异常. 另外,还可以使用异常处理部分来捕捉这些信号.

  begin
  Process.kill :QUIT, $$ # 向自己发送SIGQUIT
  rescue SignalException
  puts "rescue #$!"
  end
  # => rescue SIGQUIT

  由trap捕捉到的信号不会引发异常.

  trap会返回上一次trap所设定的处理程序. 若使用了块的话, 将把它转化为Proc对象, 然后再返回这个对象. 若设置为字符串或者 "EXIT" 的话,就返回它们. 若设置为"IGNORE" 或 "DEFAULT" 的话,就返回 nil. 若没有设置任何内容时, 将返回nil.

  另外, 若在ruby的框架外设置了信号处理程序时(例如, 扩展库独自调用sigaction时),也会返回nil.

  p Signal.trap(:INT, "p true")  # => nil
  p Signal.trap(:INT) { }    # => "p true"
  p Signal.trap(:INT, "SIG_IGN")  # => #<Proc:0x401b1328>
  p Signal.trap(:INT, "DEFAULT")  # => nil
  p Signal.trap(:INT, "EXIT")   # => nil
  p Signal.trap(:INT, nil)    # => "EXIT"

  若将系统中尚未定义的信号指定给 trap 时, 会引发 ArgumentError异常. 例如, 在本地Windows系统(mswin32, mingw 等)上的ruby环境中, 则只定义了INT ILL FPE SEGV TERM BREAK ABRT EXIT.