Я сейчас пытаюсь обернуть голову вокруг дыры NSTask, NSPipe, NSFileHandle business.Поэтому я подумал написать небольшой инструмент, который может компилировать и запускать код на Си.Я также хотел иметь возможность перенаправить мой стандартный вывод и стандартный ввод в текстовое представление.
Вот что я получил до сих пор.Я использовал код из этого поста для перенаправления моего stdio: Каков наилучший способ перенаправить стандартный вывод в 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, которая выводит стандартный вывод в мое текстовое представление и читает «123» из моего inputPipe.Как указано в моем комментарии выше, я хотел бы предоставить входные данные, когда задача выполняется, когда она необходима.
Итак, сейчас есть два вопроса.
- Есть ли способполучить уведомление, как только кто-то попытается прочитать данные из моего inputPipe?
- Если ответ на 1 - нет, есть ли другой подход, который я могу попробовать?Может быть, вы используете класс, отличный от NSTask?
Любая помощь, пример кода, ссылки на другие ресурсы приветствуются!