我试图从我的Ruby脚本中调用一个C程序,将其解析为一个参数(文件对象),然后存储C程序将返回的一些变量。
我的想法是我的Ruby脚本可以让我轻松地循环浏览文件和文件。父文件夹的文件夹,但它太慢,无法有效地处理该文件夹中的所有文件。因此使用我想要调用的C程序来处理每个文件。
我的问题是我无法找到一种从Ruby调用该C程序的方法(以及如何解析它的文件参数,我甚至不确定它是否可行,因为我没有'知道Ruby文件对象和C流是否兼容")
提前感谢您的帮助!
答案 0 :(得分:2)
您说您正在尝试调用程序,因此我假设您没有尝试静态或动态加载库并调用函数。 (如果 试图加载库来调用函数,那么请查看DL::Importer module。)
至于从Ruby调用外部程序并接收其结果(在这种情况下来自stdout
),无论是否用C语言编写,一个简单的方法是:
value = `program arg1 arg2 ...`
e.g。如果要调用的程序压缩给定文件并输出压缩大小。
size = `mycompressionprogram filename.txt`
puts "compressed result is: #{size}"
请注意,这些后面的标记为“`”。
因此,这是一种简单的方法,可以在C语言中对计算量很大的东西进行编码,并将其包装在Ruby脚本中。
答案 1 :(得分:1)
Ruby进程与不相关的C代码交互的一种简单传统方式是popen,这将允许您的Ruby进程作为单独的进程调用(编译的)代码,将您选择的参数传递给传统操作系统为此分配的空间(在您的进程中的argv中可访问int main(int argc, char** argv)
),然后通过管道与其标准输入和标准输出进行交互。但是,此技术启动另一个进程,并要求您序列化/反序列化任何正在进行的进程间通信,以便它可以在管道上运行,这可能是一个障碍。
因此,您还可以将C代码编写为Ruby扩展,这将允许您更容易地返回值,而且避免了涉及单独进程的开销。但是,请注意,如果您在C代码中对Ruby对象执行大量工作,您可能仍会承受您希望避免的性能损失。关于如何编写Ruby扩展的规范文档是README.EXT。