메세지 교환

System Program/message queue 2014. 3. 10. 15:19

1. 메세지 송신

 

메세지를 실제 전송하는 함수이다. POSIX 메세지 IPC는 시스템 V와 차이는 메세지 전송 시

우선 순위를 부여할 수 있다. 일반적으로 우선순위는 0 ~ 31의 값을 갖고 높을수록 우선 순위가 높다.

메세지 우선순위에 대한 정확한 값은 sysconf(_SC_MQ_PRIO_MAX)를 확인하는 것이 바람직하다.

 

#include <mqueue.h>

 

int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio);

 

성공하면 '0'을 리턴하고, 에러가 발생하면 '-1'을 리턴 

 

 2. 메세지 수신

 

#include <mqueue.h>

 

int mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio);

 

성공하면 수신된 메세지의 바이트 수를 리턴하고, 에러가 발생하면 '-1'을 리턴 

 

3. 타임아웃을 가진 메세지 송수신 함수

 

#include <mqueue.h>

#include <time.h>

 

int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio,

const struct timespec *abs_timeout);

 

int mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio,

const struct timespec *abs_timeout);

 

리턴값은 타임아웃이 없는 함수의 원형의 리턴값과 각각 동일하다. 

 

abs_timeout값을 얻어오기 위해 clock_gettime()를 사용할 수 있다.

설정한 시간이 만료되면 ETIMEOUT에러로 실패한다.

 

4. 송수신 함수 사용 시 주의 사항

 

메세지 송수신 함수에서 메세지 msg_len의 값은 mq_msgsize 속성보다 작거나 동일해야 한다.

그렇지 않으면 EMSGSIZE 에러가 발생한다.

 

메세지 큐가 비어있고, O_NONBLOCK이 설정된 경우 EAGAIN 에러로 즉시 실패한다.

 

5. 메세지 통지

 

POSIX가 시스템 V와 또 다른 차이점은 비동기적 메세지 큐가 가용할 수 있는 경우 통지를 받을 수 있다.

 

통지의 처리는 시그널과 쓰레드에 의해서 각각 구현될 수 있다.

 

 

#include <mqueue.h>

 

int mq_notify(mqd_t mqdes, const struct sigevent *notification);

 

성공하면 수신된 메세지의 바이트 수를 리턴하고, 에러가 발생하면 '-1'을 리턴 

 

메세지 통지에 대한 내용을 전반적으로 살펴보기에는 기술할 내용이 너무 많다. 필요 시 찾아보면 것으로 마무리 한다.

단 비동기적으로 메세지 통지를 받고자 할 경우에는 메세지 통지 기법을 사용할 수 있다.

 

 

'System Program > message queue' 카테고리의 다른 글

메세지 큐 열기 및 종료  (0) 2014.03.10
: