2

私が理解している限り、環境で次のような 2 つの変数が定義されている場合、dbus ユーザーはセッション バス デーモンに接続します。

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-1cAnv4I,guid=3a453c40b5034f
DBUS_SESSION_BUS_PID=102

デーモンが停止し、dbus-launch によって新しいデーモンを開始すると、環境の新しい値が取得されます。この場合、再起動せずに実行中のユーザー プロセスに新しい値をどのように伝達できますか?

4

2 に答える 2

1

再起動後にアドレスを取得する 1 つの方法は、対応する X11 プロパティを照会することです。

dbus-daemonはセレクション オーナー_DBUS_SESSION_BUS_ADDRESSのプロパティを設定します (uuid は の内容です)。これは、この値を読み取るために使用するコードです: https://github.com/sidorares/node-dbus/blob/master/lib/address-x11.js_DBUS_SESSION_BUS_SELECTION_[hostname]_[uuid]/var/lib/dbus/machine-id

于 2014-07-30T05:04:54.220 に答える
1

新しい dbus デーモンに再接続するロジックには、いくつかのコンポーネントとイベントが含まれる必要があります。

  • バスがまだアップしているか、ダウンしているか、または再起動しているかをアプリケーションに通知するバスモニター。

    • バスが再開されると、新しいバス アドレスがアプリケーションに送信されます。
  • ダウン イベントと再起動イベントに応答するアプリケーション:

    • バスがダウンまたは再起動した場合は、すべてを閉じて、 への呼び出しの前のバス サイクルの最初に戻りますdbus_bus_get()
    • バスがダウンしている場合は、バスが再開するまで待ちます。
    • バスが再起動された場合は、プロセス環境変数DBUS_SESSION_BUS_ADDRESSを新しい dbus アドレスに変更してから、 を呼び出して新しいバス サイクルを続行しますdbus_bus_get()

コードを読んで関数-> ->にdbus/dbus_bus.c従うと、上記のロジックが実行できることがわかる場合があります。または、同じことを行う別のアプローチを目にするかもしれません。他のアプローチを知っている場合、または他の考えがある場合は、コメントを残してください。dbus_bus_get()internal_bus_get()init_connections_unlocked()

編集:詳細を使用してアプローチを検証しました:

  • の後、dbus デーモンが切断された後もアプリケーションが実行され続けるようdbus_bus_get()に呼び出します。dbus_connection_set_exit_on_disconnect(conn,FALSE)
  • を呼び出すダム信号受信機を追加しますdbus_connection_read_write(conn,0)。dbus 接続が失われた場合は、FALSE. これは、dbus サイクルをいつ閉じるかを決定するために使用されます。dbus_connection_pop_message(conn)接続が閉じられているにもかかわらず、メッセージ キューをドレインします。
  • dbus_connection_unref(conn)それまでにdbus サイクルを閉じますdbus_shutdown()。シャットダウンされていない場合、への呼び出しdbus_bus_get()は新しい環境変数を使用しません。
  • setenv(char * name, char * value)セッション バス アドレスの設定に使用します。
于 2014-08-25T17:52:46.647 に答える