2012-03-16 21 views
1

我想弄清楚如何设置我的自定义应用程序和预制程序之间的IPC。
我正在使用MacOSX Lion 10.7.2和Xcode 4.2.1。MacOSX Lion上的进程间通信

实际上究竟是什么程序并不重要,因为我相信类似的推理可能适用于任何类型的外部过程。
出于测试目的,我用一个简单的bash脚本:

#test.sh 
echo "Starting" 
while read out 
do 
    echo $out 
done 

我想达成什么是重定向此脚本的输入和输出,用我的应用程序发送输入并读取其输出。

我试图用NSTaskNSPipeNSFileHandle如下:

-(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?
如果不是,那么有人可以解释我做错了什么吗?

回答

1

你不需要这个XPC。不会有任何区别。

是您的脚本/外部进程能够读取输入的时候,你管的东西给它的命令行

% echo "foobar" | /path/test.sh 

上?

你发送了多少数据。写作将被缓冲。 IIRC -synchronizeFile将刷新缓冲区 - 与fsync(2)相同。

+0

谢谢你的回答。是的,从命令行脚本工作正常。从我的程序中我只发送''someString'',就像你从代码中看到的一样。使用'[writeHandle synchronizeFile];'产生了'[NSConcreteFileHandle synchronizeFile]:不支持的操作' – Saphrosit 2012-03-27 18:15:13