我想弄清楚如何设置我的自定义应用程序和预制程序之间的IPC。
我正在使用MacOSX Lion 10.7.2和Xcode 4.2.1。MacOSX Lion上的进程间通信
实际上究竟是什么程序并不重要,因为我相信类似的推理可能适用于任何类型的外部过程。
出于测试目的,我用一个简单的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?
如果不是,那么有人可以解释我做错了什么吗?
谢谢你的回答。是的,从命令行脚本工作正常。从我的程序中我只发送''someString'',就像你从代码中看到的一样。使用'[writeHandle synchronizeFile];'产生了'[NSConcreteFileHandle synchronizeFile]:不支持的操作' – Saphrosit 2012-03-27 18:15:13