한국어
Linux Programming
 

[IPC]D-Bus 소개

makersweb 2015.02.28 23:56 조회 수 : 30514

D-Bus란?
D-Bus는 프로세스간 통신 (IPC)을 위한 시스템이다. 오픈 소스 소프트웨어로써 리눅스 데스크톱의 프로세스 통신을 위한 수단으로 널리 사용되고 있다. 특히 KDE와 Gnome같은 데스크탑 환경에서 중요하게 사용한다. 구조적으로는 몇 가지 계층 이 있다

• libdbus: Libdbus는 응용 프로그램간의 통신을 가능하게 하는 라이브러리이다.
• message bus daemon: DBUS데몬은 실행 파일이며 libdbus를 기반으로 하여 제작되었으며 여러 개의 응용프로그램에서 연결이 가능하다. 데몬은 버스에 연결된 하나 이상의 프로세스에 라우팅 및 루트 메시지를 처리한다.
• wrapper library 또는 binding: libdbus-glib, libdbus-qt 등 특정 어플리케이션 프레임워크 혹은 파이썬과 같은 언어에 wrapping/binding 가능하다. D-Bus 프로그래밍을 쉽게 할 수 있도록 도와준다. 즉 libdbus는 high-level binding을 위해 low-level backend로 다루어진다고 볼 수 있다. 많은 libdbus api가 binding을 위해 만들어졌다.

 dbus-schema-1.png
그림 1. D-bus 가시적인 구조


libdbus는 오직 1:1 연결만 지원하지만 라우터 역할을 하는 message bus daemon과 message를 이용한다면 제약을 극복할 수 있다.

여기서 D-bus데몬에 대해서 좀더 살펴보자.
D-Bus데몬은 각 프로세스와 양방향으로 연결되어있는 라우터의 일종으로 간주 할 수 있다. 백그라운드에서 실행되는 서비스로서 응용프로그램간의 기능 및 통신을 하는데 사용한다. 즉, 데몬은 응용 프로그램에서 메시지 전달 및 수신의 역할을 수행한다.

D-버스 데몬은 두 가지 유형이 있는데 Session Bus 및 System Bus가 바로 그것이다.
System Bus는 커널과 다양한 시스템 전체의 이벤트와 통신 할 수 있다. 하드웨어 추상화 계층 (HAL), 네트워크 매니저이나 udev등은 System Bus를 사용하는 대표적인 응용프로그램이다. 또한 System Bus는 임의의 응용프로그램들이 시스템 이벤트를 spoof(도용)하지 못하도록 되어있다.

 figure2-systembus.png
그림 2. System Bus


반면 각 사용자 세션에 부착되는 데몬을 Session Bus 불린다.
사용자에 의해 실행된 응용프로그램은 같은 시스템내의 다른 응용프로그램 사이의 통신을 위해 사용한다. 물론 시스템 버스로부터 메세지를 받을 수 있으며, 반대로 보내는 것에는 제약이 있다.

 figure1-sessionbus.png
그림 3. Session Bus

 


주요 용어 및 컨셉

 

BUS Names
1개의 연결에 대한 유일한 이름. 중복되어서는 안 된다.
D-BUS daemon에 연결되면 자동으로 unique한 bus name을 할당하고 한 번 사용된 bus name은 다시 사용되지 않는다. 사용자가 직접 이름을 등록할 수도 있다.(Optional) (ex : “org.freedesktop.TextEditor”)


Native Objects and Object Paths
D-Bus는 주고 받는 모든 메시지가 소스와 목적지가 있는 peer-to-peer 프로토콜이다. 메시지를 주고 받는데 쓰이는 주소들은 object path로 나타낸다. Object path는 표준 유닉스 파일 시스템 경로 형식을 사용한다. 유닉스 파일 시스템 경로와 다른 점이라면 숫자, 문자, 밑줄과 "/" 만 사용할 수 있다는 점이다.

dbus-schema-3.png
그림 4. D-bus에서 두 응용프로그램간 대화


Objects의 집합을 가진 D-Bus를 사용하는 모든 응용프로그램들에서 메시지들은 어플리케이션이 아닌 특정한 objects로 전달되거나 그것으로부터 전송 받으며 object path로 구분한다.  모든 object들은 하나 혹은 그 이상의 인터페이스를 제공하는데, 인터페이스는 메쏘드 이름의 namespace로 사용되며 단일 object는 여러 메쏘드를 가지고, 메쏘드는 여러 인터페이스를 가진다.

Interface
method와 signal을 group화 한 이름. 하나의 object는 여러 interface를 가질 수 있다.
interface 이름 (ex: “org.freedesktop.Introspectable”)

 

예)dbus-c++ library에서 사용하는 Interface를 XML로 작성, dbusxx-xml2cpp 툴을 통해 c++ 헤더파일로 generate한다.

<?xml version="1.0" ?> 
<node name="/org/freedesktop/DBus/Examples/Echo"> 
    <interface name="org.freedesktop.DBus.EchoDemo"> 
        <method name="HelloString"> 
            <arg type="s" name="name" direction="in"/> 
            <arg type="s" name="greeting" direction="out"/> 
        </method> 
        <signal name="EchoCount"> 
            <arg type="y" name="count"/> 
        </signal> 
    </interface> 
</node>


Method
다른 object에 의해 호출
선택적으로 input (arguments or “in parameters”)과 output (return values or “out parameters”)을 가진다.

Signal
broadcast 메시지로 하나의 object에서 해당 signal에 대해 관심이 있는 여러 object로 전달된다. (event)

Message
프로세스간 전달되는 데이터
Method Call Message
Method Return Message
Error Message
Signal Message
Header와 Body로 구성

관련 사이트 : http://dbus.freedesktop.org/doc/dbus-tutorial.html

여러가지 DBus 바인딩 : https://www.freedesktop.org/wiki/Software/DBusBindings/