在C++程序中调用 ruby_init() 后 SIGINT 信号处理问题

Trouble with SIGINT signal handling after calling ruby_init() in a C++ program

提问人:Gabriel Martins 提问时间:11/8/2023 最后编辑:Gabriel Martins 更新时间:11/9/2023 访问量:48

问:

我目前正在开发一个C++程序,该程序使用 ruby_init() 嵌入 Ruby 解释器。但是,我注意到在调用 ruby_init() 后,SIGINTCtrl+C) 信号似乎在我的程序中无法按预期工作。

按下 Ctrl+C 时,应用程序不会关闭。只有当我调用 ruby_finalize() 时,SIGINT 信号才会再次开始工作,并且当按下 Ctrl+C 时,应用程序才会关闭。

这是我的代码的简化版本:

#include <ruby.h>
#include <iostream>

int main()
{
  // SIGINT signal works at this point

  // Initialize the Ruby interpreter
  ruby_init();

  // SIGINT signal stops working after this point

  while (isOpen) {
    // Code that interacts with Ruby
  }

  // Close the Ruby interpreter
  ruby_finalize();

  // SIGINT starts working again

  return 0;
}

我试图理解为什么在嵌入 Ruby 时没有正确捕获和处理 SIGINT 信号。如果能深入了解可能导致这种行为的原因以及如何解决它,我们将不胜感激。

提前感谢您的帮助!

编辑:

我试图在 Ruby 解释器中捕获信号,但它没有收到中断信号。我尝试了以下方法:

rb_eval_string("Signal.trap('INT') { puts 'interrupt signal received' }");

C++ Ruby 嵌入 SIGInt

评论

0赞 Eljay 11/8/2023
我怀疑自己正在捕获 SIGINT 并正确处理它。ruby_init
0赞 Gabriel Martins 11/8/2023
我也是,我正在尝试使用 Signal.trap('INT') 处理它,但我还无法让它工作。
0赞 Stefan 11/8/2023
所以它既不能在你的 C 程序中工作,也不能在 Ruby 中工作?
0赞 Gabriel Martins 11/8/2023
就是这样,除非我做错了什么,否则我试过了这个,但它没有用,我认为可能是 ruby 解释器阻塞了 I/O,所以我把它移到了另一个线程,但这也没有解决它rb_eval_string("Signal.trap('INT') { puts 'interrupt signal received' }");
0赞 Eljay 11/9/2023
您的问题中缺少相关内容。rb_eval_string("Signal.trap('INT') { puts 'interrupt signal received' }");

答: 暂无答案