我需要一个“系统”函数调用,与 Python、Perl、PHP、Ruby 等中的函数调用相同。当它在 Rhino JavaScript 引擎上运行时,它将成为名为 Narwhal 的 JavaScript 标准库的一个组件,而 Rhino JavaScript 引擎又在 Java 上运行。
问题在于 Java 的标准库似乎已经抽象化了生成共享父进程 stdio 的子进程的能力。这意味着您不能将交互性推迟到子流程。
我对此的第一个尝试是实现 Python 的 subprocess.popen。这使用三个“泵”线程来独立主动复制父进程的 stdio(以防止死锁)。不幸的是,这给我们带来了两个问题。首先,当子进程自愿退出时,输入不会自动关闭。其次,子进程的流无法正确缓冲和刷新。
我正在寻找能够使我们的 require("os").system() 命令按预期工作的解决方案。
该项目位于独角鲸
相关代码:
- 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
不确定这是否是您正在寻找的,但您可以调用 Csystem
功能通过JNA图书馆:
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");
}
}
无论如何,粗略测试在 Windows 上是有效的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)