강좌 & 팁
안녕하세요 판다 이우영입니다.
비가 왕창 왔었내요. 시원하고 좋았지만 오늘은 다시 해가 쨍쨍
날이 덥지만 그래도 시작해 보겠습니다.
1. 복습!!
저번 시간에 워크큐에 사용하는 구조체를 알아 보았습니다.
#include <linux/workqueue.h> 에 선언 되어있었죠?
struct work_struct { unsigned long pending; struct list_head entry; void (*func)(void *); void *data; struct timer_list timer; }; |
여기서 중요한 변수는 우리가 만들어 주어야 하는 func, data라고 말했습니다.
(요것들은 오늘 알아보겠습니다.ㅎㅎ)
work_struct 구조체를 사용하기 위해서는 당연히 선언과 초기화를 해주어야 겠죠?
DECLARE_WORK( name, void (*function)(void *), void *data);
위 매트로를 사용해서 선언을 해줍니다.
name - 선언하는 변수 이름
function - 수행할 워크 큐 함수
data - 함수에 넘겨 줄 인자(데이터)
위 인자들은 오늘 알아 보도록 하겠습니다.
그럼 시작해 볼까요?
2. 워크 큐 초기화
워크큐를 선언 및 초기화 할 때 넘겨주는 func 함수는 우리가 워크큐를 통해 깨워줄때 동작하는 함수 입니다.
안의 내용은 작성자에 따라 다 달라지겠죠?
함수 원형도 간단 합니다.
void * xxx_func( void * data );
간단 하죠? void * data는 DECLARE_WORK 에 넘겨주는 data를 받아 옵니다.
data를 사용 안하는 경우에는 DECLARE_WORK 에서 NULL 값을 넘겨주면 됩니다.
func 함수는 void 형태로 data를 넘겨 받기 때문에 이 변수가 어떤 형태로 오는지 모릅니다.
그러니 형변환을 해주어야 합니다.
보통 다음과 같이 진행될껍니다.
void * xxx_func( void * data ) { struct xxx_data_t *pmtdata; pmydata = (staruct xxx_data_t *) data; . . . } |
선언을 했으면 워크큐를 등록해야 겠죠? 이때 사용하는 함수가 있습니다.
scahedule_work() : 워크 큐 구조체를 등록
scahedule_delayed_work() : 지정된 시간 후에 워크 큐 구조체를 등록
두함수의 차이는 아시겠죠? 원형은 다음과 같습니다.
int scahedule_work( struct work_struct * work );
int scahedule_delayed_work( struct work_struct * work, unsigned long delay );
이 함수가 정상적으로 등록 된다면 1을 실패한다면 0을 반환 합니다.
(에러처리는 중요합니다. 사용하실때는 꼭 확인해 보세요!!)
scahedule_work( &xxx_work );
scahedule_delayed_work( &xxx_work, 200 );
이런 식으로 사용하면 되겠죠?
이제 등록한 워크 큐에 이벤트를 주어 동작 시키는 부분이 남았지만 요건 다음시간으로 미루겠습니다.
그럼 오늘도 여기까지!!
다음시간에 만나요~