App cra sh при создании входной трубы в Swift iOS - PullRequest
0 голосов
/ 21 февраля 2020

Мое приложение получило cra sh с ошибкой Завершено из-за сигнала 13 .

Я создаю входной канал, и в этой строке приложение получило cra sh по вышеуказанной причине.

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

Я следую Эту ссылку для реализации этого.

Теперь над учебником работает нормально в обычном проекте.

Но я создаю фреймворк из это демо и используйте другой код приложения.

В то время приложение получило sh на линии.

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

1 Ответ

0 голосов
/ 07 марта 2020

Я обнаружил проблему после слишком большого количества НИОКР и тестирования.

Здесь мое приложение кра sh из-за того, что когда я внедряю pipe () в библиотеку и импортирую эту библиотеку, это cra sh из-за 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()
}
}

И это метод обработчика канала с main Очередь.

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