메세지 교환
System Program/message queue 2014. 3. 10. 15:191. 메세지 송신
메세지를 실제 전송하는 함수이다. 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 |
---|