2

パイプから読み書きできるようにしたいOS Xアプリ内でインタラクティブなプロセスを起動しています。

例: プロセスの起動は、ユーザーがコマンドを入力するのを待ちます。ユーザーが終了すると (エンターが押されると)、プロセスは何かを返し、再びユーザーを待ちます。

今のところ、NSPipe通信にクラスを使用していますが、問題はメソッドが呼び出されたときに、通知を受け取るためにwriteData:呼び出さなければならないことです。closeFileNSFileHandleDataAvailableNotification

完全なコード (変更されたフォルダー パス) はこれです

dispatch_queue_t taskQueue =
   dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
  dispatch_async(taskQueue, ^{

    task = [[NSTask alloc] init];
    [task setStandardOutput: [NSPipe pipe]];
    [task setStandardInput: [NSPipe pipe]];
    [task setStandardError: [task standardOutput]];
    [task setLaunchPath: @"/Users/..."];
    [task setArguments:@[@"--interaction"]];

    [[[task standardOutput] fileHandleForReading] waitForDataInBackgroundAndNotify];

    [[NSNotificationCenter defaultCenter]
        addObserverForName:NSFileHandleDataAvailableNotification
                    object:[[task standardOutput] fileHandleForReading]
                     queue:nil
                usingBlock:^(NSNotification *notification){
        NSData *output = [[[task standardOutput] fileHandleForReading] availableData];
        NSString *outStr = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding];
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"avaliable data: %@", outStr);
            NSString * message = @"IOTCM \"/Users/.../Demo.agda\" None Indirect ( Cmd_show_version )";
            [[[task standardInput] fileHandleForWriting] 
                   writeData:[message dataUsingEncoding:NSUTF8StringEncoding]];
        });
        [[[task standardOutput] fileHandleForReading] waitForDataInBackgroundAndNotify];
    }];

    [task launch];
    [task waitUntilExit];
});

最初の通知 (プロセスが応答中) をwriteData:受け取りますが、呼び出された後に通知が来ないことに注意してください。

コミュニケーションを達成する方法。

  1. ローンチされる (そして、アプリのライフサイクルを通じてローンチされたままになる)

  2. 書き込みと読み取りがサポートされています

4

1 に答える 1

1

対話的に行うのと同じ方法で、パイプに送信するすべてのコマンドに改行を追加する必要があります。改行はストリーム バッファをフラッシュし、一般に、コマンドの「go」部分です。

ただし、この回答を強化するための参照は見つかりません。

于 2015-05-24T13:26:19.743 に答える