Kotlin native - 执行可执行文件
Kotlin native - Execute an executable
我正在尝试通过 bash 执行命令,例如 konanc
。
在 KotlinJVM 中,这将仅使用 Runtime.getRuntime().exec("...")
,或使用 ProcessBuilder
创建 Process
,但是,类 中的 类 可用在 Kotlin-Native 中,因为它们是 Java 库的一部分。
我尝试在文档和 kotlin-native GitHub 存储库中搜索示例代码,但没有找到任何内容。
tl;dr 不,kotlin-native
没有标准流程api
原生的 kotlin std 仍在开发中,我认为进程 api 不会很快出现。
但是您可以使用与某些 C 进程库的互操作性,例如 https://github.com/eidheim/tiny-process-library
您可以在此处找到操作方法 https://github.com/JetBrains/kotlin-native/blob/master/INTEROP.md
然而,您也可以使用 POSIX 的 exec/fork 调用来生成和创建新进程,我认为 kotlin-native 确实包含 POSIX for linux/windows . 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
命名的文件。
恕我直言,这是 Kotlin 原生的杀手级应用。这是使用标准 Kotlin API 的解决方案的一部分;此解决方案仍然需要 dir 或 date 命令输出的缓冲,但通常适用于 Windows yea!
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")
}
最后一个从被调用进程中读取的是的!
只在 Windows 上测试过,我明天会做 unix(又名 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")
}
我正在尝试通过 bash 执行命令,例如 konanc
。
在 KotlinJVM 中,这将仅使用 Runtime.getRuntime().exec("...")
,或使用 ProcessBuilder
创建 Process
,但是,类 中的 类 可用在 Kotlin-Native 中,因为它们是 Java 库的一部分。
我尝试在文档和 kotlin-native GitHub 存储库中搜索示例代码,但没有找到任何内容。
tl;dr 不,kotlin-native
没有标准流程api原生的 kotlin std 仍在开发中,我认为进程 api 不会很快出现。
但是您可以使用与某些 C 进程库的互操作性,例如 https://github.com/eidheim/tiny-process-library
您可以在此处找到操作方法 https://github.com/JetBrains/kotlin-native/blob/master/INTEROP.md
然而,您也可以使用 POSIX 的 exec/fork 调用来生成和创建新进程,我认为 kotlin-native 确实包含 POSIX for linux/windows . 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
命名的文件。
恕我直言,这是 Kotlin 原生的杀手级应用。这是使用标准 Kotlin API 的解决方案的一部分;此解决方案仍然需要 dir 或 date 命令输出的缓冲,但通常适用于 Windows yea!
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")
}
最后一个从被调用进程中读取的是的! 只在 Windows 上测试过,我明天会做 unix(又名 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")
}