在 Swift iOS 中创建输入管道时应用崩溃(信号 13)

App crash (Signal 13) while creating input pipe in Swift iOS

我的应用因错误 因信号 13而终止。

我正在创建输入管道,但由于上述原因,应用程序崩溃了。

 public func openConsolePipe() {

        inputPipe = Pipe()

        outputPipe = Pipe()
        let pipeReadHandle = inputPipe.fileHandleForReading

        dup2(STDOUT_FILENO, outputPipe.fileHandleForWriting.fileDescriptor)
        dup2(STDERR_FILENO, outputPipe.fileHandleForWriting.fileDescriptor)

        dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDOUT_FILENO)
        dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDERR_FILENO)

        NotificationCenter.default.addObserver(self, selector: #selector(self.handlePipeNotification), name: FileHandle.readCompletionNotification, object: pipeReadHandle)

        pipeReadHandle.readInBackgroundAndNotify()
}

我正在关注 This Link 来实现这个。

现在上面的教程在常规项目中工作正常。

但我正在创建此演示的框架并将其用于另一个应用程序代码。

当时应用在线崩溃了。

dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDERR_FILENO)

这是下面的方法,因为我正在从管道获取所有日志。

@objc func handlePipeNotification(notification: Notification)
{
        inputPipe.fileHandleForReading.readInBackgroundAndNotify()

        if let data = notification.userInfo![NSFileHandleNotificationDataItem] as? Data,
        let str = String(data: data, encoding: String.Encoding.ascii) {

            outputPipe.fileHandleForWriting.write(data)
        }
}

经过大量的研发和测试,我发现了问题。

这里我的应用程序崩溃是因为当我在库中实现 pipe() 并导入该库时它崩溃了,因为 Pipe() 总是必须在主队列上 运行。

所以在这里我只是像这样在主队列中创建 pipe() 和所有方法。

public func openConsolePipe() {
DispatchQueue.main.async {
        inputPipe = Pipe()

        outputPipe = Pipe()
        let pipeReadHandle = inputPipe.fileHandleForReading

        dup2(STDOUT_FILENO, outputPipe.fileHandleForWriting.fileDescriptor)
        dup2(STDERR_FILENO, outputPipe.fileHandleForWriting.fileDescriptor)

        dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDOUT_FILENO)
        dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDERR_FILENO)

        NotificationCenter.default.addObserver(self, selector: #selector(self.handlePipeNotification), name: FileHandle.readCompletionNotification, object: pipeReadHandle)

        pipeReadHandle.readInBackgroundAndNotify()
}
}

这是主队列的管道处理程序方法。

@objc func handlePipeNotification(notification: Notification)
{
        DispatchQueue.main.async {
        inputPipe.fileHandleForReading.readInBackgroundAndNotify()

        if let data = notification.userInfo![NSFileHandleNotificationDataItem] as? Data,
        let str = String(data: data, encoding: String.Encoding.ascii) {

            outputPipe.fileHandleForWriting.write(data)
        }
        }
}