EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 5명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·Sorting Algorithm Animation (2)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

GModuleLoader
글쓴이: EzDoum 글쓴날: 2008년 07월 23일 오전 10:30
리눅스



glib의 GModule의 사용 예제 및 응용법에 대한 블로그를 찾았다. plugin 방식의 소프트웨어 만들 때 유용하다.
블로그 본문에는 GModuleLoader 란 glib object를 사용하는데, 이 부분 소스는 안올려놔서 직접 예제를 돌려 볼 수는 없지만, plugin 소프트웨어 구조나 gmoudle 사용법을 익힐 수 있다.

http://blog.eikke.com/index.php/ikke?s=GModule

http://cssed.sourceforge.net/plugins-doc/coding_plugins.html

goption을 사용해 모듈에 전달되는 인자(파라메터)를 일반화 가능
http://svn.mysql.com/svnpublic/mysql-proxy/trunk/plugins/debug/debug-plugin.c

이전에 정리해둔 shared object 자료
http://www.ezdoum.com/stories.php?story=07/09/21/2220524


  • 관련 링크
  • [분류: 리눅스 인쇄용 페이지 본문 email로 보내기 ]

    <  Lua(루아) | DSP를 이용한 다채널 MPEG4 DVR시스템 개발  >
    GModuleLoader | 답장: 1개 | 본문에 답장
    정렬 :  
    답장 EzDoum 2008년 07월 23일 오전 11:09 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
    1. /* module-test.c - test program for GMODULE
    2. */
    3. #undef G_DISABLE_ASSERT
    4. #undef G_LOG_DOMAIN
    5.  
    6. #include <gmodule.h>
    7. #include <string.h>
    8.  
    9. gchar* global_state;
    10.  
    11. G_MODULE_EXPORT void
    12. g_clash_func (void)
    13. {
    14.   global_state = "global clash";
    15. }
    16.  
    17. typedef void (*SimpleFunc) (void);
    18. typedef void (*GModuleFunc) (GModule *);
    19.  
    20. static gchar **gplugin_a_state;
    21. static gchar **gplugin_b_state;
    22.  
    23. static void
    24. compare (const gchar *desc, const gchar *expected, const gchar *found)
    25. {
    26.   if (!expected && !found)
    27.     return;
    28.  
    29.   if (expected && found && strcmp (expected, found) == 0)
    30.     return;
    31.    
    32.   g_error ("error: %s state should have been \"%s\", but is \"%s\"",
    33.            desc, expected ? expected : "NULL", found ? found : "NULL");
    34. }
    35.  
    36. static void
    37. test_states (const gchar *global, const gchar *gplugin_a,
    38.              const gchar *gplugin_b)
    39. {       
    40.   compare ("global", global, global_state);
    41.   compare ("Plugin A", gplugin_a, *gplugin_a_state);
    42.   compare ("Plugin B", gplugin_b, *gplugin_b_state);
    43.  
    44.   global_state = *gplugin_a_state = *gplugin_b_state = NULL;
    45. }
    46.  
    47. static SimpleFunc plugin_clash_func = NULL;
    48.  
    49. int
    50. main (int   arg,
    51.       char *argv[])
    52. {
    53.   GModule *module_self, *module_a, *module_b;
    54.   gchar *dir;
    55.   gchar *plugin_a, *plugin_b;
    56.   SimpleFunc f_a, f_b, f_self;
    57.   GModuleFunc gmod_f;
    58.  
    59.   if (!g_module_supported ())
    60.     g_error ("dynamic modules not supported");
    61.  
    62.   dir = g_get_current_dir ();
    63.  
    64.   plugin_a = g_strconcat (dir, G_DIR_SEPARATOR_S "libmoduletestplugin_a",
    65.                           NULL);
    66.   plugin_b = g_strconcat (dir, G_DIR_SEPARATOR_S "libmoduletestplugin_b",
    67.                           NULL);
    68.  
    69.   g_free (dir);
    70.  
    71.   /* module handles */
    72.  
    73.   module_self = g_module_open (NULL, G_MODULE_BIND_LAZY);
    74.   if (!module_self)
    75.     g_error ("error: %s", g_module_error ());
    76.  
    77.   if (!g_module_symbol (module_self, "g_module_close", (gpointer *) &f_self))
    78.     g_error ("error: %s", g_module_error ());
    79.  
    80.   module_a = g_module_open (plugin_a, G_MODULE_BIND_LAZY);
    81.   if (!module_a)
    82.     g_error ("error: %s", g_module_error ());
    83.  
    84.   module_b = g_module_open (plugin_b, G_MODULE_BIND_LAZY);
    85.   if (!module_b)
    86.     g_error ("error: %s", g_module_error ());
    87.  
    88.   /* get plugin state vars */
    89.  
    90.   if (!g_module_symbol (module_a, "gplugin_a_state",
    91.                         (gpointer *) &gplugin_a_state))
    92.     g_error ("error: %s", g_module_error ());
    93.  
    94.   if (!g_module_symbol (module_b, "gplugin_b_state",
    95.                         (gpointer *) &gplugin_b_state))
    96.     g_error ("error: %s", g_module_error ());
    97.   test_states (NULL, NULL, "check-init");
    98.  
    99.   /* get plugin specific symbols and call them
    100.    */
    101.   if (!g_module_symbol (module_a, "gplugin_a_func", (gpointer *) &f_a))
    102.     g_error ("error: %s", g_module_error ());
    103.   test_states (NULL, NULL, NULL);
    104.  
    105.   if (!g_module_symbol (module_b, "gplugin_b_func", (gpointer *) &f_b))
    106.     g_error ("error: %s", g_module_error ());
    107.   test_states (NULL, NULL, NULL);
    108.  
    109.   f_a ();
    110.   test_states (NULL, "Hello world", NULL);
    111.  
    112.   f_b ();
    113.   test_states (NULL, NULL, "Hello world");
    114.  
    115.   /* get and call globally clashing functions
    116.    */
    117.  
    118.   if (!g_module_symbol (module_self, "g_clash_func", (gpointer *) &f_self))
    119.     g_error ("error: %s", g_module_error ());
    120.   test_states (NULL, NULL, NULL);
    121.  
    122.   if (!g_module_symbol (module_a, "g_clash_func", (gpointer *) &f_a))
    123.     g_error ("error: %s", g_module_error ());
    124.   test_states (NULL, NULL, NULL);
    125.  
    126.   if (!g_module_symbol (module_b, "g_clash_func", (gpointer *) &f_b))
    127.     g_error ("error: %s", g_module_error ());
    128.   test_states (NULL, NULL, NULL);
    129.  
    130.   f_self ();
    131.   test_states ("global clash", NULL, NULL);
    132.  
    133.   f_a ();
    134.   test_states (NULL, "global clash", NULL);
    135.  
    136.   f_b ();
    137.   test_states (NULL, NULL, "global clash");
    138.  
    139.   /* get and call clashing plugin functions  */
    140.  
    141.   if (!g_module_symbol (module_a, "gplugin_clash_func", (gpointer *) &f_a))
    142.     g_error ("error: %s", g_module_error ());
    143.   test_states (NULL, NULL, NULL);
    144.  
    145.   if (!g_module_symbol (module_b, "gplugin_clash_func", (gpointer *) &f_b))
    146.     g_error ("error: %s", g_module_error ());
    147.   test_states (NULL, NULL, NULL);
    148.  
    149.   plugin_clash_func = f_a;
    150.   plugin_clash_func ();
    151.   test_states (NULL, "plugin clash", NULL);
    152.  
    153.   plugin_clash_func = f_b;
    154.   plugin_clash_func ();
    155.   test_states (NULL, NULL, "plugin clash");
    156.  
    157.   /* call gmodule function from A  */
    158.  
    159.   if (!g_module_symbol (module_a, "gplugin_a_module_func", (gpointer *) &gmod_f))
    160.     g_error ("error: %s", g_module_error ());
    161.   test_states (NULL, NULL, NULL);
    162.  
    163.   gmod_f (module_b);
    164.   test_states (NULL, NULL, "BOOH");
    165.  
    166.   gmod_f (module_a);
    167.   test_states (NULL, "BOOH", NULL);
    168.  
    169.   /* unload plugins  */
    170.  
    171.   if (!g_module_close (module_a))
    172.     g_error ("error: %s", g_module_error ());
    173.  
    174.   if (!g_module_close (module_b))
    175.     g_error ("error: %s", g_module_error ());
    176.  
    177.   return 0;
    178. }
    179.  
    180.  
    181. /* libgplugin_a.c - test plugin for testgmodule
    182. */
    183.  
    184. #undef G_DISABLE_ASSERT
    185. #undef G_LOG_DOMAIN
    186.  
    187. #include        <gmodule.h>
    188. #include        <stdlib.h>
    189.  
    190. G_MODULE_EXPORT gchar* gplugin_a_state;
    191.  
    192. G_MODULE_EXPORT void
    193. gplugin_a_func (void)
    194. {
    195.   gplugin_a_state = "Hello world";
    196. }
    197.  
    198. G_MODULE_EXPORT void
    199. gplugin_clash_func (void)
    200. {
    201.   gplugin_a_state = "plugin clash";
    202. }
    203.  
    204. G_MODULE_EXPORT void
    205. g_clash_func (void)
    206. {
    207.   gplugin_a_state = "global clash";
    208. }
    209.  
    210. G_MODULE_EXPORT void
    211. gplugin_say_boo_func (void)
    212. {
    213.   gplugin_a_state = "BOOH";
    214. }
    215.  
    216. G_MODULE_EXPORT void
    217. gplugin_a_module_func (GModule *module)
    218. {
    219.   void *f = NULL;
    220.  
    221.   if (!g_module_symbol (module, "gplugin_say_boo_func", &f ))
    222.     {
    223.       g_print ("error: %s\n", g_module_error ());
    224.       exit (1);
    225.     }
    226.  
    227.   ((void(*)(void)) f) ();
    228. }
    229.  
    230. /* libgplugin_b.c - test plugin for testgmodule
    231. */
    232.  
    233. #undef G_DISABLE_ASSERT
    234. #undef G_LOG_DOMAIN
    235.  
    236. #include        <gmodule.h>
    237.  
    238. G_MODULE_EXPORT gchar* gplugin_b_state;
    239.  
    240. G_MODULE_EXPORT const gchar*
    241. g_module_check_init (GModule *module)
    242. {
    243.   gplugin_b_state = "check-init";
    244.  
    245.   return NULL;
    246. }
    247.  
    248. G_MODULE_EXPORT void
    249. g_module_unload (GModule *module)
    250. {
    251.   gplugin_b_state = "unloaded";
    252. }
    253.  
    254. G_MODULE_EXPORT void
    255. gplugin_b_func (void)
    256. {
    257.   gplugin_b_state = "Hello world";
    258. }
    259.  
    260. G_MODULE_EXPORT void
    261. gplugin_clash_func (void)
    262. {
    263.   gplugin_b_state = "plugin clash";
    264. }
    265.  
    266. G_MODULE_EXPORT void
    267. g_clash_func (void)
    268. {
    269.   gplugin_b_state = "global clash";
    270. }
    271.  
    272. G_MODULE_EXPORT void
    273. gplugin_say_boo_func (void)
    274. {
    275.   gplugin_b_state = "BOOH";
    276. }



    [수정]

    GModuleLoader | 답장: 1개 | 본문에 답장
    정렬 :  

    답장 쓰기
    글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

    검색
    Google

    분류
    ·공지 (6)
    ·인터넷 (87)
    ·하드웨어 (260)
    ·C/C++ (65)
    ·어셈블리 (7)
    ·리눅스 (136)
    ·리눅스 커널 (67)
    ·윈도우즈 (25)
    ·데이터베이스 (20)
    ·보안 (16)
    ·.NET (25)
    ·그래픽 (13)
    ·책소개 (42)
    ·호기심 천국 (80)
    ·잡담 (111)
    ·사랑 (3)

    전체 본문수: 963
    전체 답장수: 525


    분류 : 리눅스
    최근글
    최근글
    가장 많이 읽은 글
    ·멀티쓰레드(Pthread) 프로그래밍 (0)
    뜨거운 감자
    ·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)

    EzDoum투표
    이지도움 어때요?
    이게 뭐야. 다시 안올란다. --;
    아이 좋아라~ +_+;
    관심없다.
    먼가는 있는거 같은데 뭐하는 곳이지?
    기타 (자유게시판에 글로 남겨 주세요)
    [ 결과 | 투표 ]

    랜덤 링크
    http://kldp.net


     Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
     Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum