簡體   English   中英

在 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()
}

我正在關注此鏈接以實現這一點。

現在上面的教程在常規項目中工作正常。

但是我正在創建這個演示的框架並使用它另一個應用程序代碼。

當時應用程序在 Line 上崩潰了。

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)
        }
        }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM