カスタム アプリと既製のプログラムの間で 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 を使用する方法はありますか?
いいえの場合、誰かが私が間違っていることを説明してもらえますか?