【问题标题】:How do I replace the current Swift script process with a different one如何用不同的替换当前的 Swift 脚本进程
【发布时间】:2017-04-14 01:01:16
【问题描述】:

使用 Ruby 时,以下将终止当前的 ruby​​ 脚本,并用 ssh 实例替换进程:

exec "ssh host -p 1234 -v"

这可以在 Swift 中实现吗?

【问题讨论】:

  • 在 Swift 中曾经有一个 system API,但它已被弃用,取而代之的是 posix_spawn API 和 NSTask。我会从这些开始。
  • @JAL:这些略有不同,posix_spawn 创建一个新进程。 execX 函数替换了现有进程。

标签: swift macos terminal scripting


【解决方案1】:

execv 和来自 BSD 库的相关函数 可以从 Swift 调用(带有变量的除外) 参数列表)。唯一的“挑战”是创建一个

UnsafePointer<UnsafeMutablePointer<Int8>?>

可以作为参数列表传递。一个简单的例子:

import Foundation

let args = ["ls", "-l", "/Library"]

// Array of UnsafeMutablePointer<Int8>
let cargs = args.map { strdup($0) } + [nil]

execv("/bin/ls", cargs)

fatalError("exec failed")

在这里,您可以将 Swift 字符串传递给 C 函数 strdup() 需要 const char *,并且 编译器创建一个临时的 UTF-8 表示(参见 String value to UnsafePointer<UInt8> function parameter behavior)。

【讨论】:

  • 所以这行得通,除了我还必须在调用execv 之前添加cargs.append(nil)。谢谢!
猜你喜欢
  • 2011-08-31
  • 2011-10-08
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 2021-03-01
相关资源
最近更新 更多