gpt4 book ai didi

objective-c - 使用 NSPipe 执行交互式命令

转载 作者:行者123 更新时间:2023-12-03 17:10:45 26 4
gpt4 key购买 nike

我正在我的 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. 支持读写

最佳答案

您需要将换行符附加到发送到管道的任何命令,就像交互方式一样。换行符刷新流缓冲区,通常是命令的“go”部分。

但是,我找不到任何引用资料来强化这个答案。

关于objective-c - 使用 NSPipe 执行交互式命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com