1

我正在尝试使用systemRuby 中的函数执行程序。我需要捕获程序的标准输出和标准错误,所以我使用一个将标准输出和标准错误重定向到文件的 shell 命令。一个重要的要求是我需要确定程序是正常退出还是被信号杀死。

我看到的奇怪行为是,当我将 stdout 和 stderr 重定向到文件时,$?.exited?即使程序被信号杀死也是如此!这是一个演示该问题的程序:

#! /usr/bin/ruby

File.open("bad.c", "w") do |out|
    out.print <<'EOF'
#include <stdio.h>

int main(void) {
    int *p = 0;
    *p = 42;
    printf("%d\n", *p);
    return 0;
}
EOF
end
raise "Couldn't compile bad.c" unless system("gcc -o bad bad.c")

system("./bad");
puts $?.exited?

system("./bad > out 2> err");
puts $?.exited?

这个程序的输出是

false
true

但是,我希望

false
false

因为程序在这两种情况下都被段错误杀死。

该命令ruby -v产生输出

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

任何解释和/或解决方法将不胜感激!

4

1 回答 1

2

由于您在第二次system()调用时执行 shell 重定向,因此 ruby​​ 需要调用您的 shell 来完成这项工作。即使你的程序被杀死了,shell 最终还是执行得很好。

相反,您可以直接在 ruby​​ 中进行重定向:

system("./bad", out: 'out', err: 'err');
puts $?.exited? # => false

有关更多选项,请查看文档spawn()- 选项system()的处理方式相同。

于 2013-11-07T14:29:29.240 回答