簡體   English   中英

使用 DBus 守護進程將消息從 C 應用程序交換到 python 應用程序

[英]Use DBus daemon to exchange message from C application to python application

嗨,我是 DBus 守護進程的新手,希望在 C 應用程序和 python 應用程序之間完成簡單的消息交換,它們在自定義的類似 linux 的環境中運行。 我的理解是

  1. 首先,從 init 文件啟動 dbus-daemon
  2. 將 C 應用程序和 python 應用程序注冊到 D-BUS
  3. 在這兩個應用程序之間的總線上發送消息(它只是一個簡單的字符串)。

我的問題是關於上面的(2)和(3)。 C應用程序和python應用程序如何注冊到同一條總線?

另外,需要調用哪些 API 才能在這兩個應用程序之間發送字符串消息?

[你要求簡單的消息傳遞]

你真的需要DBus嗎?

如果您要求在 C 應用程序和 Python 之間進行簡單的消息傳遞,為什么不使用像 Rabbit/ZeroMQ 這樣的消息傳遞庫? 那些已經解決了與傳遞/接收消息相關的所有問題。

而且,如果您想將依賴性保持在最低限度,您可以使用 UNIX 套接字甚至一些簡單的 TCP/UDP 數據報。

編輯:由於我試圖說服您研究 ZeroMQ 作為您的 IPC 平台以及它是多么簡單,這里有一個示例 C“客戶端”向服務器發送完整的數據報,服務器回復。

C 語言中的ZeroMQ 客戶端示例:

// Hello World client
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main ( void )
{
    printf ( "Connecting to hello world server…\n" );
    void *context   = zmq_ctx_new ();
    void *requester = zmq_socket ( context, ZMQ_REQ );
    zmq_connect ( requester, "tcp://localhost:5555" );

    int request_nbr;
    for ( request_nbr = 0; request_nbr != 10; request_nbr++ ) {
        char buffer [10];
        printf ( "Sending Hello %d…\n", request_nbr );
        zmq_send ( requester, "Hello", 5, 0 );
        zmq_recv ( requester, buffer, 10, 0 );
        printf ( "Received World %d\n", request_nbr );
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

服務器也很簡單:

用 C 語言編寫的 ZeroMQ 服務器示例

// Hello World server

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main ( void )
{
    // Socket to talk to clients
    void *context   = zmq_ctx_new ();
    void *responder = zmq_socket ( context, ZMQ_REP );
    int rc = zmq_bind ( responder, "tcp://*:5555" );
    assert ( rc == 0 );

    while ( 1 ) {
        char buffer [10];
        zmq_recv ( responder, buffer, 10, 0 );
        printf ( "Received Hello\n" );
        sleep ( 1 );                                // Do some 'work'
        zmq_send ( responder, "World", 5, 0 );
    }
    return 0;
}

每個 Linux 系統上有兩條默認總線 - 系統總線(為所有用戶共享,為系統服務創建)和會話總線。 所有 DBus 庫都可以讓您輕松連接到這些總線之一。

然后,在接收者進程中,您需要獲得總線名稱(一個能讓其他進程找到您的字符串)的所有權,並注冊一個提供一些方法的對象。 然后您將能夠從另一個進程調用這些方法。

C 的最佳 DBus API 是https://developer.gnome.org/gio/stable/GDBusConnection.html而 Python 的最佳 API 是https://github.com/LEW21/pydbus

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM