Я пытаюсь выяснить, как настроить IPC между моим пользовательским приложением и готовой программой.
Я использую MacOSX Lion 10.7.2 и Xcode 4.2.1.
На самом деле не имеет значения, какая именно программа, поскольку я считаю, что аналогичные рассуждения могут применяться к любому внешнему процессу.
Для тестирования я использую простой скрипт bash:
#test.sh
echo "Starting"
while read out
do
echo $out
done
Чего я хотел бы добиться, так это перенаправить ввод и вывод этого скрипта, используя мое приложение для отправки ему входных данных и считывания его выходных данных.
Я пытался использовать NSTask
, NSPipe
и NSFileHandle
следующим образом:
-(void)awakeFromNib {
task = [[NSTask alloc] init];
readPipe = [NSPipe pipe];
writePipe = [NSPipe pipe];
[task setStandardOutput:readPipe];
[task setStandardInput:writePipe];
[task setLaunchPath:@"/path/test.sh"];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(read:)
name:NSFileHandleReadCompletionNotification
object:nil];
[[readPipe fileHandleForReading] readInBackgroundAndNotify];
[task launch];
}
-(IBAction)write:(id)sender {
NSLog(@"Write called: %d %@\n",[task isRunning],writePipe);
NSFileHandle *writeHandle = [writePipe fileHandleForWriting];
NSString *message = @"someString";
[writeHandle writeData:[message dataUsingEncoding:NSUTF8StringEncoding] ];
}
-(void)read:(NSNotification*)notification {
NSString *output = [[NSString alloc] initWithData:[[notification userInfo] valueForKey: NSFileHandleNotificationDataItem]
encoding:NSUTF8StringEncoding];
NSLog(@"%@",output);
[output release];
[[notification object] readInBackgroundAndNotify];
}
но я могу только прочитать вывод test.sh
, но не отправлять ему какие-либо входные данные.
На самом деле любой другой пример, который я видел в Интернете, очень похож на мой код, поэтому я не уверен, что эта проблема связана с моей ошибкой (ошибками) или другими проблемами (такими как песочница приложения MacOS Lion) .
Я проверил документацию XPC, но, согласно моим исследованиям, чтобы использовать XPC API для IPC, обе стороны должны подключаться к одной и той же службе.
Это не то, что я ищу, так как я не хочу каким-либо образом изменять скрипт, я просто хочу перенаправить его ввод и вывод.
Моя проблема связана с отсутствием XPC и / или изолированной программной среды приложения?
Если да, есть ли способ использовать XPC без изменения скрипта?
Если нет, то может кто-нибудь объяснить мне, что я делаю не так?