한국어
Linux Programming
 

[IPC]D-Bus 소개

makersweb 2015.02.28 23:56 조회 수 : 25318

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-버스는 각 프로세스는 양방향 연결을 통해 연결되어있는 라우터의 일종으로 간주 할 수 있다.
D-버스는 백그라운드에서 실행되는 서비스 데몬으로써 우리는 응용 프로그램간의 기능 및 통신을 하는데 버스 데몬을 사용한다. 버스 데몬은 응용 프로그램에서 메시지 전달 및 수신의 역할을 수행한다.

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/

이 글과 연관된 다른 글
  1. [2019/06/30] GDBus 튜토리얼(GDBus tutorial) by makersweb (3482)
  2. [2019/05/02] Windows에서 Qt D-Bus를 사용하여 프로세스간 통신(IPC) by makersweb (1308)
  3. [2018/03/12] pydbus 바인딩을 이용하여 서비스 데몬과 D-Bus통신 by makersweb (696)
  4. [2018/03/07] Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 by makersweb (3649)
번호 제목 글쓴이 날짜 조회 수
35 리눅스 오디오 스택과 아키텍처 file makersweb 2020.09.02 21
34 wayland-scanner 를 통해 Wayland 프로토콜 코드생성 makersweb 2020.06.08 6
33 Wayland 의 Client Application 프로그래밍 기본 루틴 makersweb 2020.06.04 23
32 Wayland 의 주요 객체들 makersweb 2020.06.04 15
31 Weston 의 설명 및 관련 컴포넌트 makersweb 2020.06.03 15
30 64비트 리눅스에서 32비트 응용프로그램을 실행하려면 makersweb 2020.02.29 308
29 initramfs (initial ram file system: 초기 램 파일 시스템) makersweb 2020.02.25 85
28 플랫폼 디바이스 드라이버 개발 시 많이 사용되는 커널 API 및 매크로 makersweb 2020.01.28 338
27 PATH에 새로운 경로 추가 makersweb 2019.09.19 90
26 리눅스 컴파일러 최신으로 업데이트 linux 2018.12.26 1165
25 libblkid - USB Storage의 정보 가져오기 makersweb 2018.10.18 241
24 tslib 크로스 컴파일과 터치스크린 보정 makersweb 2018.08.02 1015
23 Ubuntu Linux에서 dbus-c++바인딩 D-Bus 테스트 file makersweb 2018.03.07 3649
22 NFS를 통해 파일시스템 공유 makersweb 2018.03.05 666
21 Wayland에 대한 간단한 소개 file makersweb 2017.12.29 1541
20 Ubuntu16.04에서 weston구동 file makersweb 2017.12.28 413
19 UVC 장치를 사용할때 v4l2: select timeout 에러 발생 makersweb 2017.12.27 650
» [IPC]D-Bus 소개 file makersweb 2015.02.28 25318
17 리눅스 데스크탑 환경 종류 pjk 2015.02.11 4114
16 디바이스 드라이버에 대해서 makersweb 2014.04.19 3754