首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++与Objective C之间通信的进程间通信机制

C++与Objective C之间通信的进程间通信机制
EN

Stack Overflow用户
提问于 2012-07-21 20:07:39
回答 2查看 2.8K关注 0票数 2

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

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

哪种IPC机制更适合这一点?

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

[附注:如果可能,请提供示例代码或到C++和Objective C中的进程间通信的链接。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-21 20:11:47

Unix域套接字非常适合这一点。http://www.cs.cf.ac.uk/Dave/C/node28.html

票数 3
EN

Stack Overflow用户

发布于 2012-07-21 21:50:42

如果您的目标是MacOSX10.7和更高版本,那么您可以使用XPC,为您的IPC使用Mach服务连接。

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

代码语言:javascript
复制
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服务连接,设置一个事件处理程序,然后恢复它。在那之后,你可以向你的服务器发送消息并接收它的答案:

代码语言:javascript
复制
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是纯C语言,因此可以在C、C++和Objective-C中使用。您只需要使用支持块的编译器。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11592031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档