我目前正试图围绕 NSTask、NSPipe、NSFileHandle 业务的漏洞。所以我想我写一个小工具,可以编译和运行C代码。我还希望能够将我的标准输出和标准输入重定向到文本视图。
这是我到目前为止得到的。我使用这篇文章中的代码来重定向我的 stdio:在 Cocoa 中将 stdout 重定向到 NSTextView 的最佳方法是什么?
NSPipe *inputPipe = [NSPipe pipe];
// redirect stdin to input pipe file handle
dup2([[inputPipe fileHandleForReading] fileDescriptor], STDIN_FILENO);
// curInputHandle is an instance variable of type NSFileHandle
curInputHandle = [inputPipe fileHandleForWriting];
NSPipe *outputPipe = [NSPipe pipe];
NSFileHandle *readHandle = [outputPipe fileHandleForReading];
[readHandle waitForDataInBackgroundAndNotify];
// redirect stdout to output pipe file handle
dup2([[outputPipe fileHandleForWriting] fileDescriptor], STDOUT_FILENO);
// Instead of writing to curInputHandle here I would like to do it later
// when my C program hits a scanf
[curInputHandle writeData:[@"123" dataUsingEncoding:NSUTF8StringEncoding]];
NSTask *runTask = [[[NSTask alloc] init] autorelease];
[runTask setLaunchPath:target]; // target was declared earlier
[runTask setArguments:[NSArray array]];
[runTask launch];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(stdoutDataAvailable:) name:NSFileHandleReadCompletionNotification object:readHandle];
这里是 stdoutDataAvailable 方法
- (void)stdoutDataAvailable:(NSNotification *)notification
{
NSFileHandle *handle = (NSFileHandle *)[notification object];
NSString *str = [[NSString alloc] initWithData:[handle availableData] encoding:NSUTF8StringEncoding];
[handle waitForDataInBackgroundAndNotify];
// consoleView is an NSTextView
[self.consoleView setString:[[self.consoleView string] stringByAppendingFormat:@"Output:\n%@", str]];
}
该程序运行良好。它正在运行将标准输出打印到我的文本视图并从我的 inputPipe 读取“123”的 C 程序。就像我在上面的评论中指出的那样,我想在需要时在任务运行时提供输入。
所以现在有两个问题。
- 有没有办法在有人尝试从我的 inputPipe 读取数据时立即收到通知?
- 如果 1 的答案是否定的,我可以尝试其他方法吗?也许使用 NSTask 以外的类?
非常感谢任何帮助、示例代码、其他资源的链接!