Objective c MacOSX-Lion上的进程间通信
我正在试图找出如何在我的自定义应用程序和预先制作的程序之间设置IPC。Objective c MacOSX-Lion上的进程间通信,objective-c,cocoa,osx-lion,ipc,xpc,Objective C,Cocoa,Osx Lion,Ipc,Xpc,我正在试图找出如何在我的自定义应用程序和预先制作的程序之间设置IPC。 我正在使用MacOSX Lion 10.7.2和Xcode 4.2.1 实际上,确切的程序并不重要,因为我相信类似的推理可以应用于任何类型的外部过程。 出于测试目的,我使用了一个简单的bash脚本: #test.sh echo "Starting" while read out do echo $out done 我想实现的是重定向此脚本的输入和输出,使用我的应用程序向其发送输入并读取其输出。 我尝试使用NST
我正在使用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
如果没有,那么有人能解释一下我做错了什么吗?你不需要XPC。没什么区别 当您在命令行上通过管道向脚本/外部进程传输某些内容时,脚本/外部进程是否能够读取输入
% echo "foobar" | /path/test.sh
?
你要向它发送多少数据。写入将被缓冲。IIRC
-synchronizeFile
将刷新缓冲区——与fsync(2)
相同,您不需要XPC。没什么区别
当您在命令行上通过管道向脚本/外部进程传输某些内容时,脚本/外部进程是否能够读取输入
% echo "foobar" | /path/test.sh
?
你要向它发送多少数据。写入将被缓冲。IIRC
-同步文件将刷新缓冲区-与fsync(2)
相同,谢谢您的回答。是的,从命令行脚本工作正常。从我的程序中,我只发送了“someString”
,您可以从代码中看到这一点。使用[writeHandle synchronizeFile]
已导致[NSConcreteFileHandle synchronizeFile]:操作不受支持
感谢您的回答。是的,从命令行脚本工作正常。从我的程序中,我只发送了“someString”
,您可以从代码中看到这一点。使用[writeHandle synchronizeFile]
已导致[NSConcreteFileHandle synchronizeFile]:操作不受支持