2

IPCメカニズムを実装する必要があるMacアプリケーションを開発しています。シナリオはこれです:

私のアプリケーションには2つの実行可能ファイルが含まれています。1つはネイティブMacアプリ(NSStatusItemアプリ)で、もう1つはCPPでコード化されたターミナルアプリです。これら2つのプロセス間のIPC通信を確立したいと思います。CPPからObjectiveCへ、またはその逆の両方でメッセージを送受信できるようにしたいと考えています。

どのIPCメカニズムがこれに適していますか?

また、このwiki(http://en.wikipedia.org/wiki/Inter-process_communication#Main_IPC_methods)が示すように、IPC名前付きパイプはPOSIXおよびWindowsでサポートされています。名前付きパイプを使用している場合(一方向性を知っている)、MacとObjective Cでサポートされていることを明確にしたかったのですが..?

[PS:可能であれば、C++およびObjectiveCのIPCへのサンプルコードまたはリンクを提供してください)。

4

2 に答える 2

9

Mac OS X 10.7以降をターゲットにしている場合は、IPCにMachサービス接続を使用して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アプリで実行されていると思います。イベントループがない場合は、実行中のイベントループがあることを確認する必要があります(NSRunloop、、dispatch_main()...)

クライアントでは、フラグなしでMachサービス接続を作成しXPC_CONNECTION_MACH_SERVICE_LISTENER、イベントハンドラーを設定して、再開します。その後、サーバーにメッセージを送信して、その回答を受け取ることができます。

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から使用できます。ブロックをサポートするコンパイラを使用するだけで済みます。

于 2012-07-21T13:50:41.967 に答える
3

Unixドメインソケットはこれに最適です。http://www.cs.cf.ac.uk/Dave/C/node28.html

于 2012-07-21T12:11:47.417 に答える