C++和Objective C之间通信的IPC机制

Posted

技术标签:

【中文标题】C++和Objective C之间通信的IPC机制【英文标题】:IPC Mechanism to communicate between C++ & Objective C 【发布时间】:2012-07-21 12:07:38 【问题描述】:

我正在开发一个需要实现 IPC 机制的 Mac 应用程序。场景是这样的:

我的应用程序包含两个可执行文件,一个是 Native Mac App(NSStatusItem app),另一个是在 CPP 上编码的终端应用程序。我想在这两个进程之间建立IPC通信。我希望能够从 CPP 到 Objective C 发送和接收消息,反之亦然。

哪种 IPC 机制更适合这种情况?

另外这个 wiki(http://en.wikipedia.org/wiki/Inter-process_communication#Main_IPC_methods) 显示,在 POSIX 和 Windows 中支持 IPC 命名管道。我想澄清一下,如果我使用的是命名管道(我知道它是单向的),Mac 和 Objective C 是否支持它?

[P.S : 如果可能,请提供 C++ 和 Objective C 中 IPC 的示例代码或链接)。

【问题讨论】:

【参考方案1】:

如果您的目标是 Mac OS X 10.7 及更高版本,您可以通过 Mach 服务连接为您的 IPC 使用 XPC。

在您的服务器上创建 Mach 服务,设置一个接受新连接并恢复连接的事件处理程序:

xpc_connection_t conn = xpc_connection_create_mach_service( "com.yourname.product.service", dispatch_get_main_queue(), XPC_CONNECTION_MACH_SERVICE_LISTENER );
xpc_connection_set_event_handler( conn, ^( xpc_object_t client ) 

    xpc_connection_set_event_handler( client, ^(xpc_object_t object) 
        NSLog( @"received message: %s", xpc_copy_description( object ) );

        xpc_object_t reply = xpc_dictionary_create_reply( object );
        xpc_dictionary_set_string( reply, "reply", "Back from the service" );

        xpc_connection_t remote = xpc_dictionary_get_remote_connection( object );
        xpc_connection_send_message( remote, reply );
     );

    xpc_connection_resume( client );
) ;

xpc_connection_resume( conn );

我假设这是在你的 Cocoa 应用程序中运行的,它有一个事件循环。如果没有事件循环,您需要确保有一个正在运行(NSRunloopdispatch_main()、...)

在您的客户端中,您还可以创建一个不带 XPC_CONNECTION_MACH_SERVICE_LISTENER 标志的 Mach 服务连接,设置一个事件处理程序,然后恢复它。之后,您可以向您的服务器发送消息并接收它的答案:

xpc_connection_t conn = xpc_connection_create_mach_service( "com.yourname.product.service", NULL, 0 );
xpc_connection_set_event_handler( conn, ^(xpc_object_t object) 
    NSLog( @"client received event: %s", xpc_copy_description( object ) );
);
xpc_connection_resume( conn );

xpc_object_t message = xpc_dictionary_create( NULL, NULL, 0 );
xpc_dictionary_set_string( message, "message", "hello world" );

xpc_connection_send_message_with_reply( conn, message, dispatch_get_main_queue(), ^(xpc_object_t object) 
    NSLog( @"received reply from service: %s", xpc_copy_description( object ));
);

dispatch_main();

请注意,要使您的客户端(在您的情况下可能是命令行工具)正常工作,也需要运行事件循环才能使其正常工作。在我的例子中是dispatch_main()。起初这可能看起来不方便,但这是必要的,而且非常值得。

另请注意,我的示例代码遗漏了所有真正必要的错误处理。

XPC API 是纯 C 语言,因此可用于 C、C++ 和 Objective-C。您只需要使用支持块的编译器即可。

【讨论】:

对不起,我的目标是 Mac OS 10.5 及更高版本【参考方案2】:

Unix 域套接字对此非常有用。 http://www.cs.cf.ac.uk/Dave/C/node28.html

【讨论】:

以上是关于C++和Objective C之间通信的IPC机制的主要内容,如果未能解决你的问题,请参考以下文章

C++ DLL(本地挂钩)和 C# 应用程序之间的合适 IPC

linux 进程间通信机制(IPC机制)- 管道

C# 应用程序与 C++ 和 VB.Net 中的其他应用程序之间的 IPC

IPC机制总结

计算机基础OS 进程间通信(IPC)机制介绍

IPC 机制