首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NSPipe进行交互命令

使用NSPipe进行交互命令
EN

Stack Overflow用户
提问于 2015-05-23 16:23:49
回答 1查看 665关注 0票数 2

我在我的OS应用程序中启动了一些交互过程,我希望能够从管道中读写。

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

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

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

代码语言:javascript
复制
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. 支持写作和阅读。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-24 13:26:19

您需要在发送到管道的任何命令中添加一个换行符,其方式与交互方式相同。Newline刷新流缓冲区,通常是命令的"go“部分。

然而,我找不到任何理由来重新执行这一答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30414970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档