2

我正在我的 OS X 应用程序中启动一些交互式进程,我希望能够从管道读取和写入。

例如:启动进程将等待用户输入命令。当用户完成时(也就是按下回车键),进程将返回一些东西,然后再次等待用户。

目前,我正在使用NSPipe类进行通信,但问题是在writeData:调用方法时,我必须调用closeFile才能获得通知NSFileHandleDataAvailableNotification

完整代码(更改文件夹路径)是这样的

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

您需要以与交互方式相同的方式将换行符附加到您发送到管道的任何命令中。换行符刷新流缓冲区,通常是命令的“开始”部分。

但是,我找不到任何参考来重新执行此答案。

于 2015-05-24T13:26:19.743 回答