6

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

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

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

4

3 回答 3

3

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 <name>创建一个以参数命名的文件。name

于 2018-07-22T00:00:04.513 回答
0

恕我直言,这是 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")
}
于 2021-09-28T02:52:41.870 回答
0

最后一个从被调用的进程中读取是的!只在 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")
}
于 2021-09-30T02:28:11.563 回答