본문 바로가기

프로그래밍(TA, AA)/C C++

[시스템프로그래밍] IPC D-Bus란?

D-Bus란?


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

 

 - libdbus: Libdbus는 응용 프로그램간의 통신을 가능하게 하는 라이브러리입니다.

 - message bus damon: DBUS데몬은 실행 파일이며 libdbus를 기반으로 하여 제작되었으며 여러 개의 응용프로그램에서 연결이 가능합니다. 데몬은 버스에 연결된 하나 이상의 프로세스에 라우팅 및 루트 메시지를 처리합니다.

 - wrapper library 또는 binding: libdbus-glib, libdbus-qt 등 특정 어플리케이션 프레임워크 혹은 파이썬과 같은 언어에 wrapping/binding이 가능합니다. D-Bus 프로그램을 쉽게 할 수 있도록 도와줍니다. 즉 libdbus는 high-level bidning을 위해 low-level backend로 다루어진다고 볼 수 있습니다. 많은 libdbus api가 binding을 위해 만들어졌습니다. 

 

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

 

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

 

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

 

 

 

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

 

 

 

주요 용어 및 컨셉


 * Bus Names

 - 1개의 연결에 대한 유일한 이름, 중복되어서는 안됩니다.

 - D-BUS daemon에 연결되면 자동으로 unique한 bus name을 할당

 - 한 번 사용된 bus name은 다시 사용되지 않습니다.

 - 사용자가 직접 이름을 등록할 수도 있습니다.

 

 * Native Objects and Object Paths

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

 

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

 

 * Interface

method와 signal을 group화 한 이름으로 하나의 object는 여러 interface를 가질수 있습니다.

 

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

<?xml version="1.0" ?>
<node name="/org/freedesktop/DBus/Example/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>

 

 

 * Methods

다른 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로 구성