Frage

Ich versuche, Nstask zu verwenden, um den Befehl "apropos" von UNIX auszuführen. Hier ist mein Code:

NSTask *apropos = [[NSTask alloc] init];
NSPipe *pipe = [[NSPipe alloc] init];
[apropos setLaunchPath:@"/usr/bin/apropos"];
[apropos setArguments:[NSArray arrayWithObjects:@"filename", @"match", nil]];
[apropos setStandardOutput:pipe];
[apropos launch];
[apropos waitUntilExit];

Das Problem ist, dass dies nie zurückkehrt. Ich habe auch versucht, den Beispielcode von Apple (TaskWrapper) zu verwenden, und er gibt die Ausgabe (in drei Segmenten) zurück, ruft jedoch nie den prozessfinierten Handler auf.

Darüber hinaus empfängt der Appendoutput: Handler Duplikate. Wenn also beispielsweise APROPOS dies zurückgibt:

1 2 3 4 5

Ich könnte so etwas erhalten:

1 2 3

1 2 3 4

5

(In 3 Anhangnachrichten gruppiert).

Ich stelle fest, dass APROPOS die Ausgabe in einem Format anzeigt, in dem es möglich ist, in die Befehlszeile nach oben und unten zu scrollen, anstatt die Daten direkt direkt an die Standardausgabe auszugeben. Wie lese ich das zuverlässig durch Nstask und Nspipe?

War es hilfreich?

Lösung

Ich habe gerade dieses Programm getestet und es funktioniert gut: Das Programm endet und endet und /tmp/apropos.txt enthält die Ausgabe von apropos.

#import <Foundation/Foundation.h>

int main()
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];

    NSTask *apropos = [[[NSTask alloc] init] autorelease];
    NSPipe *pipe = [[[NSPipe alloc] init] autorelease];
    NSFileHandle *readHandle = [pipe fileHandleForReading];
    [apropos setLaunchPath:@"/usr/bin/apropos"];
    [apropos setArguments:[NSArray arrayWithObjects:@"filename", @"match", nil]];
    [apropos setStandardOutput:pipe];
    [apropos launch];
    [apropos waitUntilExit];

    NSString *output = [[[NSString alloc]
        initWithData:[readHandle readDataToEndOfFile]
            encoding:NSUTF8StringEncoding] autorelease];

    [output writeToFile:@"/tmp/apropos.txt" atomically:YES
        encoding:NSUTF8StringEncoding error:NULL];

    [pool drain];
    return 0;
}

Sind Sie zufällig mit Verwendung NSLog() Um die Ausgabe zu inspizieren? In diesem Fall müssen Sie möglicherweise ein Rohr für ein Rohr einstellen stdin wie erklärt In meiner Antwort von mir auf eine staskbezogene Frage. Es scheint, dass NSLog() Daten senden an stderr Affekte NSTask.

Andere Tipps

Mit Ihrem ursprünglichen Code würde ich mir vorstellen, dass Sie die Ausgabe des Befehls nicht lesen. Die Rohre haben nur eine begrenzte Puffergröße, und wenn Sie die Ausgabe der Aufgabe nicht lesen, kann sie darauf warten, dass der Puffer entleert wird. Ich weiß nichts über den Beispielcode, den Sie ausprobiert haben, also kann ich dort nicht helfen. Was die letzte Frage betrifft, apropos Verwendet nur den Pager, wenn er mit einem Terminal verbunden ist. Sie emulieren kein Terminal, also müssen Sie sich keine Sorgen machen. Sie können dies beweisen, indem Sie laufen apropos whatever | cat Im Terminal und Überprüfen, ob der Pager nicht aufgerufen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top