Ruby 中的Kernel模块

Ruby中有很多全局函数用于和操作系统交互。可用实现以下任务:

创建进程、运行程序、处理信号、网络连接、多线程任务等。

Ruby提供Kernel模块,它紧密依赖操作系统的类型和版本;但是不必导入include Kernel 严格的描述,Ruby解释器中的内置函数全部定义在Kernel模块中,即解释器可直接通信内核;关系是: Kernel模块被包含在Object基础类中,基础类是所有类的祖父,因此所有类均可调用Kernel中的方法

$ ======================================================= 那么与操作系统相关的内置函数:ruby 的Kernel是vm kernel 不是 system kernel!

核心:获取在线帮助Kernel.methods

=> [:local_variables, :global_variables, :Integer, :Float, :String, :Array, :Hash, :test, :lambda, :warn,
:fork, :exec, :raise, :catch, :throw, :system, :spawn, :abort, :sleep, :at_exit, :exit, :exit!, :rand, :srand,
:syscall, :caller, :caller_locations, :set_trace_func, :load, :select, :send, :extend, :`, :p, :pp, :loop,
:binding, :open, :readline, :readlines, :print, :putc, :puts, :gets, :sprintf, :format, :printf, :require, ]

A)底层操作 (内置Kernel模块)

1、调用系统命令 == Kernel::system()

使用:Kernel.system('/bin/ls')启动一个外壳程序,由外壳执行指定的程序,但不关心程序的输出结果

注意:父进程会等待子进程完成退出后,父进程才会退出

2、派生新进程 == Kernel::fork()

使用:Kernel.fork() 可用执行系统fork调用,生成新的子进程;fork()返回两个值

注意:父进程fork方法返回生成的子进程pid号,子进程fork方法返回空值

3、调用系统命令 == Kernel::exec()

使用:Kernel.exec('/bin/uname') 可用执行系统exec族调用,替换当前ruby进程内存空间,执行新程序

注意:父进程会被子进程替换,进而子进程变成shell的子进程,常与fork()方法共用

4、停止程序执行 == Kernel::exit()

使用:Kernel.exit()以正常方式,停止ruby程序的执行

5、终止程序执行 == Kernel::abort()

使用:Kernel.abort()以非正常方式,停止ruby程序的执行

6、调用ruby脚本执行 == Kernel::load()

使用:Kernel.load('/bin/xxx.rb') 加载Ruby文件并执行

7、触发程序异常 == Kernel::raise()

使用:Kernel.raise( message) 抛出Ruby解释器的异常

8、触发程序抛出异常 == Kernel::throw()

使用:Kernel.throw( xxx)让Ruby解释器抛出一个异常给调用进程

9、触发程序睡眠 == Kernel::sleep()

使用:Kernel.sleep( secnum)让Ruby解释器睡眠足够的时间

10、执行系统调用 == Kernel::syscall()

使用:Kernel.syscall(num, arg...)让Ruby解释器执行某号系统调用

11、执行系统命令二 == Kernel::spawn()

使用:Kernel.spawn('/bin/ls')启动一个外壳程序,由外壳执行指定的程序,但不关心程序的输出结果

注意:父进程不会等待子进程完成退出后,直接返回子进程的pid号

B)I/O操作

11、打开文件 == Kerenl::open()

使用:Kernel.open( path,mode) 让Ruby解释器打开一个存在的文件,返回文件句柄

作用:当打开的文件为"|"或者"|-"时,此方法也用于派生使用管道通信的子进程

12、对象输出 == Kerenl::puts()

使用:Kernel.puts() 输出内容

作用:向终端输出字符串,并在最后自动添加换行符

**13、对象输入 == Kerenl::gets() **

使用:Kernel.gets() 输入内容

作用:从标准输入读取字符,保存到相关变量里

C)信号操作 (内置Signal模块)

14、信号列表 == Signal::list()

使用:Signal.list() 可列出当前系统中支持的所有信号

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

15、信号注册 == Signal::trap()

使用:Signal.trap( signal, command) 将command注册为本程序的signal信号处理方法

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

D)进程操作 (内置Process模块)

16、派生子进程 == Process::fork()

使用:Process.fork('/bin/ls')方法可生成新的子进程,等同于Kernel.fork()方法

17、派生子进程 == Process::spawn()

使用:Process.spawn('/bin/ls')方法可生成新的子进程,等同于Kernel.spawn()方法,不等待子进程

18、等待子进程 == Process::wait()/Process.wait2()/ Process.waitpid(pid, flag)/Process.waitpid2(pid, flag)

使用:Process.wait()方法可阻塞父进程执行,等待[指定子进程]执行完成,可抛出异常

19、退出进程 == Process::exit()

使用:Process.exit()方法可正常停止本进程

20、终止进程 == Process::abort()

使用:Process.abort()方法可非正常终止的本进程

21、监视子进程 == Process::detach(pid)

使用:Process.detach( pid)方法可监视指定的子进程,阻塞方法

22、服务进程 == Process::daemon()

使用:Process.daemon(nochdir=nil,noclose=nil)方法可将进程变成daemon服务进程,脱离终端并错误输出为/dev/null等

23、获取/设置进程有效Group ID == Process::egid

通过:Process.egid() 返回当前进程的有效Group ID == Process.egid = xxx

24、获取/设置进程有效UID == Process::euid

通过:Process.euid() 返回当前进程的有效UID == Process.euid = yyy

25、获取/设置进程实际Group ID == Process::gid

通过:Process.gid() 返回当前进程的实际Group ID == Process.gid = mmm

26、获取/设置进程实际UID == Process::uid

通过:Process.uid() 返回当前进程的实际UID == Process.uid = nnn

27、获取进程Pid == Process::pid

通过:Process.pid() 返回当前进程的PID ==》 它的值与 $$ 是相同的

28、获取进程父进程PPID == Process::ppid

通过:Process.ppid() 返回当前进程父进程PID

29、获取进程的进程组信息 == Process::getpgid(pid) 或者 Process.getpgrp([pid])

调用:Process.getpgid(pid) 获取某个进程的进程组

30、设置进程的进程组信息 == Process::setpgid(pid, pgrp) 或者 Process.setpgrp([pid])

调用:Process.setpgid(pid, pgrp) 设置某个进程的进程组,若PID=0则意味着当前进程

31、设置进程的新会话 == Process.setsid()

调用:Process.setsid()生成新的session,并剥离tty。可方便地生成deamon。返回session ID