* signal.c (sig_signame): implements Signal.signame method

[Feature #5613]
* test/ruby/test_signal.rb (test_signame): adds test for above
* NEWS: add an item about above



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37723 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
kosaki 2012-11-19 09:43:53 +00:00
Родитель 92cef134b5
Коммит 58282ed667
4 изменённых файлов: 49 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,10 @@
Tue Nov 20 08:36:15 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* signal.c (sig_signame): implements Signal.signame method
[Feature #5613]
* test/ruby/test_signal.rb (test_signame): adds test for above
* NEWS: add an item about above
Mon Nov 19 16:30:59 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
* struct.c (rb_struct_each_pair): yield associated pairs so that

3
NEWS
Просмотреть файл

@ -105,6 +105,9 @@ with all sufficient information, see the ChangeLog file.
* added Range#bsearch for binary search.
* Signal
* added method:
* added Signal.signame which returns signal name
* incompatible changes:
* Signal.trap raises ArgumentError when :SEGV, :BUS, :ILL, :FPE, :VTALRM
are specified.

Просмотреть файл

@ -207,6 +207,26 @@ signo2signm(int no)
return 0;
}
/*
* call-seq:
* Signal.signame(signo) -> string
*
* convert signal number to signal name
*
* Signal.trap("INT") { |signo| puts Signal.signame(signo) }
* Process.kill("INT", 0)
*
* <em>produces:</em>
*
* INT
*/
static VALUE
sig_signame(VALUE recv, VALUE signo)
{
const char *signame = signo2signm(NUM2INT(signo));
return rb_str_new_cstr(signame);
}
const char *
ruby_signal_name(int no)
{
@ -1086,6 +1106,7 @@ Init_signal(void)
rb_define_global_function("trap", sig_trap, -1);
rb_define_module_function(mSignal, "trap", sig_trap, -1);
rb_define_module_function(mSignal, "list", sig_list, 0);
rb_define_module_function(mSignal, "signame", sig_signame, 1);
rb_define_method(rb_eSignal, "initialize", esignal_init, -1);
rb_define_method(rb_eSignal, "signo", esignal_signo, 0);

Просмотреть файл

@ -240,4 +240,22 @@ EOS
}
end
def test_signame
return unless Process.respond_to?(:kill)
begin
10.times do
caught = 0
signame = "wrong"
Signal.trap("INT") { |signo| signame = Signal.signame(signo); caught = 1; }
Process.kill("INT", 0)
sleep 0.01 while caught==0
assert_equal(signame, "INT")
end
ensure
Signal.trap("INT", "DEFAULT")
end
end
end