ruby process

管理UNIX进程的模块.

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

 

管理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(whichwho)

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

Process 模块中定义了下列可供which使用的常数:PRIO_PROCESSPRIO_PGRPPRIO_USER

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

若未能成功获取优先级,则引发Errno::EXXX异常。

Process.initgroups(usergroup)

招募撰稿人

(请参考initgroups(3))

Process.kill(signalpid ... )

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

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

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

另外请参考trap

Process.setpgrp(pidpgrp)
Process.setpgrp ((<ruby 1.7 特性>))
Process.setpgid(pidpgrp)

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

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

ruby 1.7 特性: 在1.7版本中, Process.setpgrp不带参数。

Process.setpriority(whichwhoprio)

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

Process 模块中定义了下列可供which使用的常数:PRIO_PROCESSPRIO_PGRPPRIO_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.getpriorityProcess.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 。

 

posted on 2017-07-26 10:33  guolongnv  阅读(615)  评论(0)    收藏  举报