대부분 GUI를 사용하는 앱들은 Event-Driven Architecture를 사용하고 있다. Event-Driven 방식은 메인루프에서 이벤트(터치,타임아웃 등)를 받아들이고 이벤트가 발생하면 등록된 핸들러를 이용해서 이벤트 처리 결과를 사용자에게 전달한다. 보통 메인루프는 한번의 iteration(?또는 사이클)을 돌면서 이벤트를 확인,처리한 뒤 idle상태로 들어간다.
GNOME에서 만든 라이브러리 glib에서 main loop기능을 제공한다.
glib의 g_main_loop를 사용하기 위해서는 우선
$ pkg-config --list-all
libecpg libecpg - PostgreSQL libecpg library
libpq libpq - PostgreSQL libpq library
gio-unix-2.0 GIO unix specific APIs - unix specific headers for glib I/O library
popt popt - popt library.
libpgtypes libpgtypes - PostgreSQL libpgtypes library
gio-2.0 GIO - glib I/O library
libpcreposix libpcreposix - PCREPosix - Posix compatible interface to libpcre
libxslt libxslt - XSLT library version 2.
libcurl libcurl - Library to transfer files with ftp, http, etc.
rpm RPM - RPM Package Manager
lua5.1 Lua - An Extensible Extension Language
gobject-2.0 GObject - GLib Type, Object, Parameter and Signal Library
gmodule-export-2.0 GModule - Dynamic module loader for GLib
libxml-2.0 libXML - libXML library version2.
lua-5.1 Lua - An Extensible Extension Language
libpcrecpp libpcrecpp - PCRECPP - C++ wrapper for PCRE
libpcre libpcre - PCRE - Perl compatible regular expressions C library with 8 bit character support
libzstd zstd - fast lossless compression algorithm library
sqlite3 SQLite - SQL database engine
libiodbc iODBC - iODBC Driver Manager
glib-2.0 GLib - C Utility Library
pkg-config명령어로 glib-2.0이 설치되어 있는지 확인한다.
메인루프는 GMainLoop객체를 만들고 이 객체를 이용해서 루프를 만들고 실행하고 종료한다. GMainLoop는 GMainContext랑 함께 사용되고 GMainContext는 소스(GSource)를 관리한다.
[10초마다 타임아웃 이벤트를 처리하는 예제]
#include<glib.h>#include<stdio.h>gboolean timeout_callback(gpointer data){printf("timeout_callback called\n");return TRUE;}int main(void){GMainLoop * loop = NULL;GMainContext * context = NULL;GSource * source = NULL;int id;//create timeout sourcesource = g_timeout_source_new_seconds(5);//create a contextcontext = g_main_context_new();//attach source to contextid = g_source_attach(source, context);//if context is NULL, the default context will be used.//create main looploop = g_main_loop_new(context, FALSE);//set the callback for this sourceg_source_set_callback(source, timeout_callback, loop, NULL);g_main_loop_run(loop);g_main_loop_unref(loop);return 0;}
[컴파일 실행결과]
gcc -o glibtimeouttest timeouttest.c `pkg-config --cflags --libs glib-2.0`
$ ./glibtimeouttest
timeout_callback called
timeout_callback called
timeout_callback called
timeout_callback called
timeout_callback called
timeout_callback called
timeout_callback called
timeout_callback called
timeout_callback called
timeout_callback called
^C
참조
http://devlib.symbian.slions.net/s3/GUID-7FD05006-09C1-4EF4-A2EB-AD98C2FA8866.html
http://lethean.github.io/2009/09/21/using-glib-mainloop/
'리눅스' 카테고리의 다른 글
Unix Domain Socket (0) | 2020.04.12 |
---|---|
[Linux] Daemon Process란? (0) | 2018.03.25 |
리눅스 signal (0) | 2018.02.17 |
pthread에서 메모리 침범과 pthread_cancel (1) | 2018.01.21 |
정적 라이브러리(static library)와 공유 라이브러리(shared library) (0) | 2018.01.14 |