Mac OS X Lion 上的进程间通信

Posted

技术标签:

【中文标题】Mac OS X Lion 上的进程间通信【英文标题】:InterProcess Communication on MacOSX Lion 【发布时间】:2012-03-16 18:53:01 【问题描述】:

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

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

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

我想要实现的是重定向这个脚本的输入和输出,使用我的应用程序向它发送输入并读取它的输出。

我尝试使用NSTask,NSPipeNSFileHandle如下:

-(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) 相同。

【讨论】:

感谢您的回答。是的,从命令行脚本可以正常工作。从我的程序中,我只发送"someString",正如您从代码中看到的那样。使用[writeHandle synchronizeFile]; 导致[NSConcreteFileHandle synchronizeFile]: Operation not supported

以上是关于Mac OS X Lion 上的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X 上进行进程间通信的最佳方式

对于 Mac 上的高带宽数据流,最有效的进程间通信方法是啥?

[ Linux ] 进程间通信介绍 管道

Linux进程间通信总结

Linux进程间通信总结

Linux进程间通信总结