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);
}
callback 함수를 호출


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/hellocb
action cb 1
state cb 2, I am hungry


댓글