2 votes

Plantage de l'application (Signal 13) lors de la création d'un tuyau d'entrée dans Swift iOS

Mon application s'est plantée avec une erreur Terminé en raison du signal 13 .

Je suis en train de créer un tuyau d'entrée et sur cette ligne l'application s'est plantée avec la raison ci-dessus.

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

Je suis Ce lien pour mettre en œuvre cette mesure.

Maintenant, le tutoriel ci-dessus fonctionne bien dans un projet régulier.

Mais je crée le cadre de cette démo et l'utilise dans un autre code d'application.

À ce moment-là, l'application s'est écrasée sur la ligne.

dup2(inputPipe.fileHandleForWriting.fileDescriptor, STDERR_FILENO)

C'est la méthode ci-dessous dans la mesure où je récupère tous les journaux à partir du tuyau.

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

2voto

hardik vyas Points 378

J'ai un problème fondé après trop de R&D et de tests.

Ici, mon application s'est plantée parce que lorsque j'ai implémenté pipe() dans la bibliothèque et que j'ai importé cette bibliothèque, elle s'est plantée parce que Pipe() doit toujours être exécuté sur la file d'attente principale.

Donc ici je crée simplement pipe() et toutes les méthodes dans la file d'attente principale comme ceci.

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

Et voici la méthode de gestion des tuyaux avec la file d'attente principale.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X