[英]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.