gpt4 book ai didi

swift - 使用 swift 在 macOS 中打开新的伪终端设备文件

转载 作者:可可西里 更新时间:2023-11-01 01:07:24 25 4
gpt4 key购买 nike

我试图通过使用 Foundation 库中的进程来保持 shell ( bash/zsh/etc ) 运行。

我知道如何将 Pipe 用于其他命令行可执行文件的标准输入/输出/错误,但似乎 shell 程序要求标准输入/输出/错误文件是终端设备文件。

看起来这些是名为 /dev/ttys<3 digit number> 的文件为每个新的 shell 实例创建。我如何自己创建这些文件并快速使用它们?

最佳答案

解决方案:

事实证明,这比我想象的要容易得多。以下是创建一对主从伪终端 FileHandle 对象所需的步骤:

  1. 导入 Darwin 模块。
  2. 调用 posix_openpt(int oflag) 获取可用主伪终端设备的文件描述符。
  3. 调用grantpt(int filedes)建立相应从伪终端设备的所有权。
  4. 调用unlockpt(int filedes)解锁从属伪终端设备。
  5. 调用 ptsname(int filedes) 获取从属伪终端设备的路径。
  6. 使用步骤 2 中的文件描述符和步骤 5 中的路径创建 FileHandle 对象。

在步骤 3 - 5 中,filedes 是从步骤 1 调用 posix_openpt(int oflag) 返回的文件描述符。在第 1 步中使用 O_RDRW 作为 oflag 参数,以获得对主伪终端设备文件的读写权限。

我们保持 bash session 并让它运行 tty 命令的示例代码:

import Foundation
import Darwin

class A: NSObject {
var task: Process?
var slaveFile: FileHandle?
var masterFile: FileHandle?

override init() {
self.task = Process()
var masterFD: Int32 = 0
masterFD = posix_openpt(O_RDWR)
grantpt(masterFD)
unlockpt(masterFD)
self.masterFile = FileHandle.init(fileDescriptor: masterFD)
let slavePath = String.init(cString: ptsname(masterFD))
self.slaveFile = FileHandle.init(forUpdatingAtPath: slavePath)
self.task!.executableURL = URL(fileURLWithPath: "/bin/bash")
self.task!.arguments = ["-i"]
self.task!.standardOutput = slaveFile
self.task!.standardInput = slaveFile
self.task!.standardError = slaveFile
}

func run() {
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
guard let self = self else {
return
}
do {
try self.task!.run()
} catch {
print("Something went wrong.\n")
}
}
let data = self.masterFile!.availableData
let strData = String(data: data, encoding: String.Encoding.utf8)!
print("Output: "+strData)
self.masterFile!.write("tty\u{0D}".data(using: String.Encoding.utf8)!)
sleep(1)
let data1 = self.masterFile!.availableData
let strData1 = String(data: data1, encoding: String.Encoding.utf8)!
print("Output: "+strData1)
}
}

let a = A()
a.run()

关于swift - 使用 swift 在 macOS 中打开新的伪终端设备文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55228685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com