根据proc手册,可以通过打开"/ proc/mounts"监视linux系统中的挂载点更改,并添加文件描述符以读fd_set入select()调用.
以下代码适用于Ubuntu 9.04,而不适用于Ubuntu 10.04(2.6.32 linux内核):
int mfd = open("/proc/mounts", O_RDONLY, 0);
fd_set rfds;
struct timeval tv;
int rv;
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
int changes = 0;
while ((rv = select(mfd+1, &rfds, NULL, NULL, &tv)) >= 0) {
if (FD_ISSET(mfd, &rfds)) {
fprintf(stdout, "Mount points changed. %d.\n", changes++);
}
FD_ZERO(&rfds);
FD_SET(mfd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
if (changes > 10) {
exit(EXIT_FAILURE);
}
}
Run Code Online (Sandbox Code Playgroud)
文件描述符总是在一台机器上可读,因此它会在select调用中不断弹出.即使坐骑没有变化.
我在这里错过了什么吗?
在此先感谢您的帮助!
我需要知道如何在rails中创建对象数组以及如何在其中添加元素.
我是铁杆上的红宝石新手,这可能是某种愚蠢的问题,但我无法找到确切的答案.那么请对此提出一些专家意见
我正在努力编写一个干净的方法,当传递一个字符串数组时,x返回一个总共x的数组元素的随机列表,例如.
def getrandomarrayelements(thearray, howmany)
return [something]
end
Run Code Online (Sandbox Code Playgroud)
是的,我应该提交我现有的代码,虽然工作效果不好,但它有8行长,我觉得可以在一个代码中完成?!
您可以在类中包含模块,以便在将类方法和实例方法添加到该特定类的方面扩展类功能.
module M
def self.class_method_from_module
'from class_method_from_module'
end
def instance_method_from_module
'from instance_method_from_module'
end
end
class C
include M
def self.class_method
'from class_method'
end
def instance_method
'from instance_method'
end
end
puts C.class_method => 'from class_method'
puts C.class_method_from_module => 'from class_method_from_module'
puts C.new.instance_method => 'from instance_method'
puts C.new.instance_method_from_module => 'instance_method_from_module'
Run Code Online (Sandbox Code Playgroud)
现在,即使从内存中删除模块M,仍然具有以下内容:
Object.send(:remove_const, :M) #remove the module M
puts C.class_method_from_module => 'from class_method_from_module'
puts C.new.instance_method_from_module => 'instance_method_from_module'
Run Code Online (Sandbox Code Playgroud)
而不是方法丢失.这是为什么?删除模块添加到类的功能的最佳方法是什么?
我想在Ruby中运行一个线程安全的脚本来调用外部程序,然后检查该外部程序的退出状态.最好的方法是什么?到目前为止,我一直在检查$?,但我认为我正在与该计划的其他部分达成竞争条件.
这是一些示例代码:
Thread.new do
`external_program`
if $?.exitstatus == 0
# it worked.
else
# it didn't work.
end
end
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会做类似的事情
Process.new(`external_program`).exitstatus
Run Code Online (Sandbox Code Playgroud)
所以它与这个过程exitstatus密不可分,而不是最后一个完成的过程.有没有办法做到这一点?
我试着寻找这个,但找不到多少.这似乎是之前可能会被问到的事情(很多次?),所以我很抱歉,如果是这样的话.
我想知道在Ruby中解析文件某些部分的最快方法是什么.例如,假设我知道我想要的特定功能的信息是在1000行文件的第500行和第600行之间.(显然这类问题适用于大型文件,我只是为了举例而使用那些较小的数字),因为我知道它不会出现在上半部分,是否有一种忽略这些信息的快速方法?
目前我正在使用以下内容:
while buffer = file_in.gets and file_in.lineno <600
next unless file_in.lineno > 500
if buffer.chomp!.include? some_string
do_func_whatever
end
end
Run Code Online (Sandbox Code Playgroud)
它有效,但我不禁认为它可以更好地工作.
我对Ruby很陌生,并且有兴趣学习新的工作方式.
我刚刚安装了rvm然后是bundler gem.
? ~ ruby -v
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.7.0]
? ~ gem list|grep bundler
bundler (1.0.12)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行bundle命令时,我收到以下错误:
? ~ which bundle
bundle not found
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果我在前面添加"rvm ruby",它就有效
? ~ rvm ruby bundle
Run Code Online (Sandbox Code Playgroud)
不过,我不认为我应该在任何命令之前加上rvm ruby.这种行为是否正确?
编辑:显然问题是shell之间没有记住默认配置.
如果我键入"rvm 1.8.7 --default"然后它可以工作,但是一旦我打开一个新的shell,它就不会.
我有一个带有类变量的模块
module Abc
@@variable = "huhu"
def self.get_variable
@@variable
end
class Hello
def hola
puts Abc.get_variable
end
end
end
a = Abc::Hello.new
a.hola
Run Code Online (Sandbox Code Playgroud)
是否可以不使用方法进入@@variable内部?我的意思是说会很好.只是好奇.Helloget_variableAbc.variable
练习要求为所提供的每个功能编写单元测试.我正在测试的一个项目是,是否引发了适当的异常.建议我们assert_raise为此目的使用.
这是我正在测试的代码:
class ParserError < Exception
end
Pair = Struct.new(:token, :word)
def peek(word_list)
begin
word_list.first.token
rescue
nil
end
end
def match(word_list, expecting)
word = word_list.shift
if word.token == expecting
word
else
nil
end
end
def skip_word(word_list, token)
while peek(word_list) == token
match(word_list, token)
end
end
def parse_verb(word_list)
skip_word(word_list, :stop)
if peek(word_list) == :verb
return match(word_list, :verb)
else
raise ParserError.new("Expected a verb next.")
end
end
Run Code Online (Sandbox Code Playgroud)
这是测试,对于函数parse_verb:
def test_parse_verb
list_one = [Pair.new(:verb, 'go'), Pair.new(:noun, 'king')]
assert_equal(parse_verb(list_one), Pair.new(:verb, 'go')) …Run Code Online (Sandbox Code Playgroud) ruby unit-testing assert assertraises learn-ruby-the-hard-way
在运行与JRuby中的临时文件交互的某些代码的单元测试时,我有时会得到以下结果:
Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-6395"
Run Code Online (Sandbox Code Playgroud)
它似乎没有引起任何问题,但是发生了什么,我怎样才能确定它发生的位置?我尝试打开-d,但这并没有给我一个例外的堆栈跟踪.
ruby ×9
arrays ×2
accessor ×1
assert ×1
assertraises ×1
c ×1
debugging ×1
fileparsing ×1
filesystems ×1
jruby ×1
lines ×1
linux ×1
mount ×1
procfs ×1
rvm ×1
unit-testing ×1