代码之家  ›  专栏  ›  技术社区  ›  notnoop

生成交互式进程

  •  2
  • notnoop  · 技术社区  · 16 年前

    Java应用程序如何从Java/Scala生成新的交互式应用程序(例如命令行编辑器)?

    Runtime.getRuntime().exec("vim test") ,我只会得到一个进程实例,而 vim

    5 回复  |  直到 15 年前
        1
  •  4
  •   Sean Patrick Floyd    15 年前

    System.console()

    您必须手动将每个输入重定向到派生进程,并将每个输出重定向到用户。

        2
  •  0
  •   Anton    16 年前

    假设你在linux上,你必须在新的终端窗口中运行这个命令

    Runtime.getRuntime().exec(new String[]{"xterm", "-e", "vim test"});
    
        3
  •  0
  •   Daniel C. Sobral    15 年前

    scala.sys.Process("vim test").run(true)
    

    哦,这只在Scala主干上——可能是Scala 2.9。

        4
  •  0
  •   thebamaman    15 年前

    只有 当您绝对需要一个终端/控制台(如vim所需的)时,请使用此方法。对于所有其他用途,请运行时.exec().

    我也有同样的问题。我要做的是使用Java本机接口调用一个小型c函数,该函数执行系统调用:

    系统进程.java:

    class SystemProcess {
      public native int systemCall(String cmd);
      public boolean execute() { return systemCall("vim test") == 0; }
      static { System.loadLibrary("SystemProcess"); }
    }
    

    系统进程.c

    #include [javah-generated-header.h]
    [javah-generated-function-prototype] (JNIEnv *env, jobject obj, jstring jcmd) {
      jboolean iscopy;
      const char *cmd = (*env)->GetStringUTFChars(env, jcmd, &iscopy);
      jint ec = system(cmd);
      (*env)->ReleaseStringUTFChars(env, jcmd, cmd);
      return ec;
    }
    

    我将由您决定如何实际地对共享库执行所有头生成和c编译。如果能让您感觉更好的话,可以随意用fork/exec或posix_spawn替换系统。但在大多数情况下,这在unix/linux上应该是一样的。

        5
  •  0
  •   Barry McGillin    11 年前

    在1.7中,这是非常直接的。(当然,一切都是你以前解决过的)

    ProcessBuilder builder = new ProcessBuilder("/usr/bin/vim");
    Map<String, String> environ = builder.environment();
    builder.redirectInput(ProcessBuilder.Redirect.INHERIT);
    builder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
    final Process process = builder.start();
    process.waitFor();