在 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)
}
}
}
我的应用因错误 因信号 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)
}
}
}