目次
dbus
概要
- dbus 自体は,IPC と RMI を実現するためのプロトコル(実装?)
- 主にデスクトップアプリケーション間(GNOME, KDE, etc)で利用されることを想定している.
- よって,TCP/IP 越しでのメッセージパッシングは想定外.
- したい場合は,magic cookie と呼ばれる鍵のようなものをサーバ,クライアント双方で利用しなければならない.これは,NFS でホームディレクトリを共有していると言う想定のもの.
- C言語で記述されている.
- さまざまな言語にマッピングされていて,マッピング言語の方から利用するのが一般的.
- glib, python, c++, java, etc …
オブジェクト
native object and object path
- native object は,各言語のオブジェクトを指す.GObject, java.lang.Object, etc.
- 他の言語からオブジェクトをマッピングできるように,dbus 内で名前を付けている.
- /org/kde/kspread/sheets/3/cells/4/5
- 名前の最初の方はドメイン名にでもしとけ,とチュートリアル.
methods and signals
- dbus において,オブジェクトは必ずメソッドとシグナル(GUIプログラミングの時のイベントに相当)を持つ.
- method はオブジェクトに対して適用可能な操作.
- signal はオブジェクトから他のオブジェクトに対するマルチキャスト(原文はbroadcasts from the object to any interested observers…)
Interfaces
- method と signal をまとめたもの
- org.freedesktop.Introspectable
- ほとんどの実装では,これらの名前をそれぞれの言語のインタフェースに直接マッピングする.
bus names
- com.mycompany.TextEditor のような名前で外部アプリケーションから参照される名前.
- bus name は内部的に一意な番号で管理される.
- : で始まる.ex) :34-907 数字に意味なし.
- 名前の所有者が管理されている.
- ホスト内において同一アプリケーションの複数動作を回避するために利用できる.
address
- dbus daemon にアクセスするためのアドレス.
- unix domain, tcp/ip でもなんでもよし.
- unix 環境では後述の dbus-launch によって設定する.
dbus-glib
dbus related commands
dbus-daemon
- アプリケーション間メッセージを中継するためのデーモン
- システムワイドデーモンと,セッションデーモンの 2 種類.
- システムワイドデーモン:アプリケーション全てにブロードキャストする.
- udev の実装とかに使われているのかな?
- セッションデーモン:アプリケーション同士のメッセージパッシングに利用される.自分でアプリケーションを書く場合は基本的にこれを利用する.
dbus-luanch
- dbus-daemon を利用する環境を整えるためのコマンド
- dbus-daemon に対するアドレスを環境変数にセットする.
- dbus-daemon が起動してなければ,起動する.
- dbus を利用するアプリケーションは,起動時に,要求する bus name を持つ dbus-daemon が起動しているかを探索する(この時X11を要求してくるため,コマンドライン上では動作しないことがある).発見できた場合,その dbus-daemon のアドレス(デフォルトだと unix domain socket name)を取得し,アプリケーションが実行されたシェルの環境変数にセットする.
備考
ネットワーク越しの利用
- 基本的に TCP/IP は利用不可能.
- Havoc というメインの人が強烈に嫌がっているので,dbus-daemon にその機能が統合されることはなさそう.
- 一応,conf ファイルに tcp を指定する部分があるが,socket credential が共有できる環境(ホームディレクトリが NFS で共有されているとか)でなければ意味なし.
- FreeBSD だと,tcp は全く動作せず(2008/09/10現在)
- dbus-sysdeps-unix.c において,INET ソケットに対して credential を読もうとしているが,FreeBSD では許可されていない.credential を利用している限りは解決しないので,しばらくは無理かと思う.
dbus-launch の使い方
- コマンドラインプログラミングで,サーバとクライアントを利用する場合は,以下のような流れにするべき.
dbus-launch --sh-syntax
- でアプリケーションが利用する用の dbus-daemon を起動.同時にプリントされた環境変数を書き留めておく.次に,サーバプログラムを起動するシェルで環境変数をセットし,起動.次に,クライアントプログラムを起動するシェルで環境変数をセットし,起動.