특정 키워드에 해당하는 콜백 함수 호출 하는 경우 구현

boy0226의 이미지

어느 특정 키워드 일 경우 콜백함수를 호출하도록 하는 방법에는 어떤것 들이 있을까요?

저는 단순히 구조체 배열로 해서 함수를 등록하는 방법.

{"kldp1", FunKLDP1()}
{"kldp2", FunKLDP2()}
{"kldp3", FunKLDP3()}
{"kldp4", FunKLDP4()}

밖에 저는 떠오르지 않는데요.

또 어떤것들이 있을까요?

bootmeta의 이미지

냉무.

boy0226의 이미지

Hash-table로 구성을 한다면 괜찮을 듯 하네요.

그런데 hash-table에 Insert를 해야 할텐데요.

만약 특정 키워드에 매칭되는 함수가 꽤 많다면 약 1000개 정도 된다면...

어떻게 insert를 해주면 될까요?

수작업????

에라이디여~ 초급 산을 넘어라~

cinsk의 이미지

고전적인 방법이라면, 따로 script를 만들어서 { ... } entry만 들어있는 .c를 만들 수도 있겠고, dlopen()후 dlsym()을 쓰는 방법도 있겠네요.

--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/

bushi의 이미지

gcc 입니다.

좀 무식하지만... section 을 따로 잡고 밀어넣은 다음에 초기화 할 때 일괄등록하는 방법도 가능합니다.
첨부 예제에서는 .callbacks 라는 섹션으로 잡았고,
시작점과 끝점을 대단히 무식한 방법으로 가져왔습니다.

[bushi@rose callback_section]$ make
gcc -Wall   -c -o callback.o callback.c
gcc -Wall   -c -o rbtree.o rbtree.c
gcc -Wall   -c -o test1_module.o test1_module.c
gcc -Wall   -c -o test2_module.o test2_module.c
gcc -Wall   -c -o test.o test.c
gcc -Wall   -c -o cbstart.o cbstart.c
gcc -Wall   -c -o cbend.o cbend.c
gcc -o test test.o callback.o rbtree.o \
		-Wl,--start-group cbstart.o \
		test1_module.o test2_module.o \
		cbend.o -Wl,--end-group
[bushi@rose callback_section]$ 
[bushi@rose callback_section]$ 
[bushi@rose callback_section]$ ./test
test1_callback()
test2_callback()
[bushi@rose callback_section]$ 

OTL

댓글 첨부 파일: 
첨부파일 크기
Plain text icon callback_section.tgz.txt4.92 KB
boy0226의 이미지

bootmeta님, cinsk님 답변 감사합니다.

@cinsk님 좀 더 여쭙게씁니다.

고전적인 방법의 의미는

===========
reference.c file
===========
struct a {
char *str;
void (*fp)(void);
};

struct a tmp = {
{"kldp1", FunPKLDP1}
{"kldp2", FunPKLDP2}
{"kldp3", FunPKLDP3}
.
.
.
{"kldp100", FunPKLDP100}
};

이렇게 한 파일에 정의를 해놓고

해쉬 테이블에 삽입하는 방법을 의미 하신 건가요???

에라이디여~ 초급 산을 넘어라~

bushi의 이미지

컴파일 타임에 끝장을 보고 싶으신 거라면 gperf 를 사용해서 자동화를 시켜버리시죠.
해시테이블 만들어주고 lookup 함수도 만들어줍니다.

[bushi@rose callback_gperf]$ make
gperf -m 10 callbacks.gperf > callbacks.h
cc -Wall   -c -o test.o test.c
cc   test.o test1_module.c test2_module.c   -o test
[bushi@rose callback_gperf]$ 
[bushi@rose callback_gperf]$ ./test
test1_callback()
test2_callback()
[bushi@rose callback_gperf]$ 

OTL

댓글 첨부 파일: 
첨부파일 크기
Plain text icon callback_gperf.tgz.txt864바이트
boy0226의 이미지

bushi님 답변 감사합니다.

첨부 파일은 잘 보았습니다.

제가 아직 많이 부족해서 더 여쭙겠습니다.

첨부 파일 소스에

callback_init () 호출 시

callback_register ()를 호출하면서 등록이 되는데

등롤 될때

for 문을 돌면서 등록이 됩니다 그 때 인자는 단순히 __start, __end뿐인데

어떻게 test1, test2가 등록이 되죠?

답변주신것도 이해 못해서 죄송합니다.

에라이디여~ 초급 산을 넘어라~

bushi의 이미지

.callbacks 라는 섹션에 callback_reg_t 구조체의 배열이 들어가게 됩니다.
그 배열들 중 첫번째 요소는 cbstart 라는 마킹용 더미이고, 마지막 요소역시 cbend 라는 마킹용 더미입니다.
cbstart 와 cbend 사이에 있는 callback_reg_t 들을 가져와서 callback_register() 로 등록합니다.

원하는 callback_reg_t 구조체를 를 .callbacks 섹션에 집어넣기 위해선 __callback 매크로를 사용합니다.
사용 예제는 test1_module.c 과 test2_module.c 에 있습니다.
잘난 체 하려고 파일을 나눠놨는데... 코드 어디에 있어도 상관은 없습니다만,
링크할 때 cbstart.o 와 cbend.o 사이에 반드시 오브젝트가 있어야 합니다.
(이게... 원래는 링크스립트를 만들어서 .callbacks 섹션의 위치를 코드에 알려주도록 해야하는데,
배보다 배꼽이 더 커지는 것 같아서... 아주 무식해지기로 작심하고 마킹용 더미를 집어넣는 바람에 링크 순서에 주의해야하는 상황이 됐습니다.)

OTL

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.