【问题标题】:Kotlin native - Execute an executableKotlin native - 执行可执行文件
【发布时间】:2018-12-29 20:25:05
【问题描述】:

我正在尝试通过 bash 执行命令,例如 konanc

在 KotlinJVM 中,这只是使用 Runtime.getRuntime().exec("..."),或者使用 ProcessBuilder 创建一个 Process,但是,这些类在 Kotlin-Native 中都不可用,因为它们是 Java 库的一部分。

我尝试在文档和 kotlin-native GitHub 存储库中搜索示例代码,但没有找到任何东西。

【问题讨论】:

    标签: kotlin exec shellexecute kotlin-native


    【解决方案1】:

    tl;dr 不,kotlin-native 没有标准流程 api

    本机的 kotlin std 仍在开发中,我认为 process api 不会很快出现。

    但是,您可以使用与某些 C 进程库(例如 https://github.com/eidheim/tiny-process-library)的互操作性

    您可以在这里找到操作方法https://github.com/JetBrains/kotlin-native/blob/master/INTEROP.md

    但是,您也可以使用 POSIX 的 exec/fork 调用来生成和创建新进程,我认为 kotlin-native 确实包含适用于 linux/windows 的 POSIX。 https://github.com/JetBrains/kotlin-native/tree/master/platformLibs/src/platform 平台见 posix.def。

    例子:

    import platform.posix.*
    
    fun main(arguments: Array<String>) {
        println("${arguments[0]}")
        execlp("touch", "touch", "${arguments[0]}")
    }
    

    使用./file &lt;name&gt; 调用它会在您的当前目录中创建一个以参数name 命名的文件。

    【讨论】:

    • 感谢您的回答,我提供了一个工作示例。
    • execlp 后的任何代码都没有被执行,有解决方法吗?
    • println("Hello"), execlp("java", "/usr/bin/java", "-version"), println("Done") 。 ---- 程序以打印“完成”结束...
    • 抱歉,回答迟了,但我认为这是因为 execlp 等待子进程退出。例如,如果进程类似于浏览器,它可能会一直阻塞,直到应用程序关闭。
    【解决方案2】:

    恕我直言,这是 Kotlin 原生的杀手级应用。这是使用标准 Kotlin API 解决方案的一部分;该解决方案仍然需要缓冲 dir 或 date 命令输出,但通常适用于 Windows 是的!

    import kotlin.native.OsFamily.*
    import platform.posix.*
    
    fun main(arguments: Array<String>) {
        println("running")
        if (arguments.size >= 1) {
            arguments.forEach { a -> println(a) }
        }
        val platform  = Platform
        val os = platform.osFamily
        println("os is " + os)
        when (os) {
            WINDOWS -> runWindows()
            else -> runUnix()
        }
    }
    
    fun runWindows() {
        val result = execlp("dir", "","")
        println("Ran on windows $result");
    }
    
    fun runUnix() {
        execlp("date", "","")
        println("Ran on UNIX")
    }
    

    【讨论】:

      【解决方案3】:

      最后一个从被调用的进程中读取是的! 只在 Windows 上测试过,明天我会做 unix (aka mac :))。

      import kotlin.native.OsFamily.*
      import platform.posix.*
      import kotlinx.cinterop.refTo
      import kotlinx.cinterop.toKString
      
      fun main(arguments: Array<String>) {
          println("running")
          if (arguments.size >= 1) {
              arguments.forEach { a -> println(a) }
          }
          val platform  = Platform
          val os = platform.osFamily
          println("os is " + os)
          when (os) {
              WINDOWS -> runWindows()
              else -> runUnix()
          }
      }
      
      fun runWindows() {
          val result = execl("dir", "","")
          //hmm emulate https://gist.github.com/a-cordier/33211eda92b8084a9e7e
          //https://www.youtube.com/watch?v=6xbLgZpOBi8
          val fp = _popen("dir", "r") ?: error("Failed to run command: dir")
          val buffer = ByteArray(4096)
          var counter = 0
          println("hmm")
          while (true) {
              val input = fgets(buffer.refTo(0), buffer.size, fp) ?: break
              print(input.toKString())
              //println(counter++)
          }
          println("Ran on windows $result");
      }
      
      fun runUnix() {
          execlp("date", "","")
          println("Ran on UNIX")
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 2022-08-19
        • 2018-06-08
        • 2015-02-28
        • 1970-01-01
        相关资源
        最近更新 更多