Callback in c language
Callback 이란?
callback이란 말 그대로 call을 했을 때 무언가 응답(back)이 오는 것 입니다.언제 사용되는가?
callback은 여러 상황에서 사용하겠지만, 제가 경험한 바로는 가장 많이 사용되는 곳은 계층을 나눌 때 입니다. 계층을 나누게 되면 각각의 계층 간 독립적인 동작을 합니다. 단순 함수 call을 하고 return type으로 결과를 받아볼 수도 있습니다. 하지만 함수가 return이 되고 다른 thread에서 내부 동작이 일어난다고 생각해봅시다. 진행되는 중 에러가 발생할수도 있고, 처리가 완전히 끝나는 시점을 알아야 할 필요도 있습니다.물론 동작이 모두 끝난 후 함수를 return할 수도 있겠습니다. 이럴 경우 한 번 함수를 call하는데 시간이 오래걸리기 때문에 사용자 입장에서 고려해야할 점이 많습니다.
git clone https://github.com/juwith/jsutils.git
git checkout b3fa4c4f2642efbcc2dbeefaa1fdee41b88f2f41
cd callback
|
Library
typedef struct { void (*JuCB_action_cb)(void* pvPrivate, JuCB_ACT_TYPE event); void (*JuCB_state_cb)(void* pvPrivate, JuCB_STA_TYPE event, char* msg); } JuCB_CallBack_T;
여러 callback을 등록할 수 있도록 구조체형으로 타입 정의
void _jucb_register_cb(JuCB* obj, JuCB_CallBack_T* cb) { obj->cb.JuCB_action_cb = cb->JuCB_action_cb; obj->cb.JuCB_state_cb = cb->JuCB_state_cb; //printf("register cb\n"); }
객체에 callback 함수 pointer를 지정
void _jucb_action(JuCB* obj) { if(!obj->cb.JuCB_action_cb) { printf("you need to register action cb!\n"); return; } //printf("action callback\n"); obj->cb.JuCB_action_cb( obj, JuCB_ACT_RUN); } void _jucb_state(JuCB* obj) { if(!obj->cb.JuCB_state_cb) { printf("you need to register state cb!\n"); return; } char* msg = "I am hungry"; //printf("state callback\n"); obj->cb.JuCB_state_cb( obj, JuCB_STA_HUNGRY, msg); }
User Layer
void main() { JuCB *jcb = JuCB_init(); JuCB_CallBack_T cbt; cbt.JuCB_action_cb = _action_cb; cbt.JuCB_state_cb = _state_cb; JuCB_register_cb(jcb, &cbt); JuCB_action(jcb); JuCB_state(jcb); JuCB_destroy(jcb); }
5~6번째 라인을 참고하면 callback 함수를 pointer로 지정하는 것을 확인할 수 있습니다.
void _action_cb(void* pvPrivate, JuCB_ACT_TYPE pvParam) { printf("action cb %d\n",pvParam); } void _state_cb(void* pvPrivate, JuCB_STA_TYPE pvParam, char* msg) { printf("state cb %d, %s\n",pvParam,msg); }
Library에서 함수를 호출해줄 때.
결과
-bash-4.2$ ./install/bin/hellocbaction cb 1
state cb 2, I am hungry

댓글
댓글 쓰기