Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

mq_send

사용 법

#include <mqueue.h>

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

#define _XOPEN_SOURCE 600
#include <time.h>
#include <mqueue.h>

mqd_t mq_timedsend(mqd_t mqdes, const char *msg_ptr,
              size_t msg_len, unsigned msg_prio,
              const struct timespec *abs_timeout);

-lrt를 링크해야 한다.

설명

mq_send 함수는 __msg_ptr이 가리키는 데이터를 mqdes가 지시하는 메시지 큐에 쓴다. 매개변수 msg_len__는 메시지 큐에 쓸 msg_ptr의 데이터 크기를 바이트 단위로 지정한다. __msg_len은 반드시 mq_msgsize__보다 작거나 같아야만 한다. 0크기 메시지도 전송할 수 있다.

매개변수 __msg_prio__는 0이상의 값을 지정할 수 있으며, 메시지의 우선순위를 결정한다. 메시지는 우선순위에 따라서 내림차순으로 쌓인다.

만약 메시지 큐가 가득 차있다면 (메시지 큐에 저장할 수 있는 데이터 원소의 크기는 __mq_maxmsg__로 정의한다.), 기본적으로 ms_send는 사용할 수 있는 공간이 생길 때까지, 혹은 시그널로 인터럽트가 걸릴 때까지 봉쇄된다. 만약 O_NONBLOCK 플래그가 사용되었다면, mq_send는 EAGAIN 에러와 함께 즉시 반환한다.

mq_timesend 함수는 큐가 가득차서 봉쇄될 경우, __abs_timeout__시간만큼 기다리다가 반환한다는 것을 제외하고 mq_send 함수와 동일하다. 이 함수를 사용할려면 O_NONBLOCK플래그가 비활성화 되어 있어야 한다. __abs_timeout__는 지금부터 기다릴 시간이 아니다. 1970-01-01 00:00:00를 기준으로 해서 기다리는 시간이다. 그러므로 만약 10초를 기다리고 싶다면, 현재의 유닉스 시간 + 10을 해줘야 한다.
struct timespec {
    time_t tv_sec;        /* seconds */
    long   tv_nsec;       /* nanoseconds */
};
만약 메시지 큐가 가득 찬 상태에서 timeout 시간이 이미 초과되어 버렸다면 (과거를 가리키고 있다면) mq_timesend 함수는 즉시 반환한다.

반환 값

mq_send가 성공하면 0을 반환한다. 실패했다면 -1을 반환한다.

에러 값

EAGAIN 큐가 비어있고, O_NONBLOCK플래그가 설정되어 있다. EBADF mqdes가 잘못된 메시지 큐를 지시하고 있다. EINTR 시그널(:12)로 인하여 인터럽트가 걸렸다. EMSGSIZE __msg_lenmq_msgsize__보다 크다. ETIMEOUT 주어진 시간내에 메시지전송에 실패했다.

관련 글

mq_open(3)

예제

메시지큐의 사용참고