启动后写入NSTasks标准输入

| 我目前正在尝试将NSTask,NSPipe,NSFileHandle业务缠在头上。所以我想我写了一个小工具,可以编译和运行C代码。我还希望能够将我的stdout和stdin重定向到文本视图。 这是我到目前为止所得到的。 我使用了这篇文章中的代码来重定向我的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]];
}
该程序运行正常。它正在运行C程序,将标准输出打印到我的文本视图,并从我的inputPipe中读取\“ 123 \”。就像我在上面的评论中指出的那样,我想在任务运行后在需要时提供输入。 因此,现在有两个问题。 一旦有人尝试从我的inputPipe读取数据,有没有办法得到通知? 如果对1的回答为否,是否可以尝试其他方法?也许使用NSTask以外的类? 我们非常感谢您提供的任何帮助,示例代码以及指向其他资源的链接!     
已邀请:
        我不确定是否可以在
NSPipe
上检测到“拉”。我确实有一种模糊的感觉,即使用
select()
轮询写可用性或使用
kqueue
NSFileHandle
的基础文件描述符上查找I / O可用性事件可能会达到目的,但是我对使用这些功能不是很熟悉通过这种方式。 您是否必须支持任意的C程序,或者它是特殊的守护程序还是您开发的东西? 如果它是您自己的程序,则可以查看有关
outputPipe
的反馈请求,或者在找到要发送的内容时将其输入到
inputPipe
上,然后让C程序在将其发送时使用它准备;如果是别人的代码,您可以使用链接时方法(因为您正在编译的代码)钩住
scanf
和朋友,就像附录A-4中描述的那样。 : http://www.cs.umd.edu/Library/TRs/CS-TR-4585/CS-TR-4585.pdf 要点是使用自定义I / O函数(可能会向您的应用发送一些提示,表明它们需要输入)制作一个
.dylib
,将其链接到内置程序中,为启动的任务设置一个环境变量(
DYLD_BIND_AT_LAUNCH=YES
)。 ,然后运行它。一旦了解了这些问题,就可以为主机程序提供所需的任何便利。     

要回复问题请先登录注册