From: Kouhei S. <ko...@co...> - 2006-06-14 04:52:52
|
須藤です. Ruby側で登録したコールバック(例えばsignal_connectとか)がCから呼び出される とします.例えば,以下のようなプログラムで,以下のコマンドでコンパイルでき ます. % cc `pkg-config gtk+-2.0 cairo --cflags --libs` \ -I`ruby -rrbconfig -e 'print Config::CONFIG["archdir"]'` \ -l`ruby -rrbconfig -e 'print Config::CONFIG["RUBY_SO_NAME"]'` \ -o test test.c #include <gtk/gtk.h> #include <ruby.h> int main(int argc, char **argv) { gtk_init(&argc, &argv); ruby_init(); ruby_init_loadpath(); ruby_script(argv[0]); ruby_set_argv(argc, argv); rb_eval_string("require 'gtk2'\n" "Gtk.init\n" "Gtk.timeout_add(0) do\n" " raise 'timeout'\n" "end\n"); gtk_main(); return 0; } これを実行するとSegmentation faultで落ちます. (eval):3: [BUG] Segmentation fault ruby 1.8.4 (2005-12-24) [i486-linux] Rubyで書くとこんな感じですが,こちらは落ちません. require "gtk2" Gtk.init Gtk.timeout_add(0) do raise "timeout" end Gtk.main なかださんにいろいろ教えてもらっていて,詳しいことはそちらを みてもらうとよいと思いますが,私にはよくわからないところがあ ります. http://www.rubyist.net/~nobu/t/20060611.html#c01 http://www.rubyist.net/~nobu/t/20060612.html#p01 http://www.rubyist.net/~nobu/t/20060612.html#c02 http://www.rubyist.net/~nobu/t/20060614.html#p01 それは,一番最後の http://www.rubyist.net/~nobu/t/20060614.html#p01 で言われている「境界面でラップする」という解決法を具体的にど のように実現すればよいかがわかりません.だれか教えてもらえま せんか? |