我需要一个“系统”函数调用,与Python,Perl,PHP,Ruby和&c相同。当它在Rhino JavaScript引擎上运行时,它将成为名为Narwhal的JavaScript标准库的组件,而Rhino JavaScript引擎又在Java上运行。

问题在于Java的标准库似乎已经抽象出了生成共享父进程的stdio的子进程的能力。这意味着您不能将交互性推迟到子流程中。

我的第一个建议是实现Python的subprocess.popen。这使用三个“pumper”线程独立地主动复制父进程的stdio(以防止死锁)。不幸的是,这给我们带来了两个问题。首先,当子流程自愿退出时,输入不会自动关闭。其次,子进程的流无法正确缓冲和刷新。

我正在寻找可以使我们的require(“os”)。system()命令正常工作的解决方案。

该项目位于http://narwhaljs.org

相关代码:

  • http://github.com/tlrobinson/narwhal/blob/d147c160f11fdfb7f3c0763acf352b2b0e2713f7/lib/os.js#L10
  • http://github.com/tlrobinson/narwhal/blob/d147c160f11fdfb7f3c0763acf352b2b0e2713f7/engines/rhino/lib/os-engine.js#L37
  • 最佳答案

    不确定这是否是您要查找的内容,但是可以通过JNA library调用C system函数:

    public class System {
      public interface C extends Library {
        C INSTANCE = (C) Native.loadLibrary(
            (Platform.isWindows() ? "msvcrt" : "c"), C.class);
    
        public int system(String format);
      }
    
      public static void main(String[] args) {
        C.INSTANCE.system("vi");
      }
    }
    

    无论如何,类(class)测试都可以在Windows上进行。

    09-28 03:41