'System Program/message queue'에 해당되는 글 2건

  1. 2014.03.10 메세지 교환
  2. 2014.03.10 메세지 큐 열기 및 종료

메세지 교환

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
:

메세지 큐 열기 및 종료

System Program/message queue 2014. 3. 10. 12:01

1. 개요

 

메세지 큐는 프로세스간에 IPC 통신이다. IPC관련하여 시스템 V와 POSIX의 두 양대 산맥이 있다.

내가 생각하기에는 POSIX가 대세인 것 같고, 리눅스에서는 더더욱 그런 것 같다.

따라서 시스템 V 기반도 있지만 나는 POSIX 기반만 중점적으로 살펴본다.

 

2. 메세지 큐 열기

 

#include <fcntl.h>

#include <sys/stat.h>

#include <mqueue.h>

 

mqd_t mq_open(const char *name, int oflag, ...

/* mode_t mode, struct mq_attr *attr */);

 

성공하면 메세지 큐 디스크립터 리턴, 에러가 발생하면 (mqd_t) -1을 리턴

 

두번째 인자인 oflag에 가능한 값은 아래와 같다.

 

 oflag

 설명

 O_CREAT

 큐가 이미 존재하지 않는 경우 생성

 O_EXCL

 O_CREAT를 가지고, 큐를 전용으로 생성

 O_RDONLY

 읽기 전용으로 열기

 O_WRONLY

 쓰기 전용으로 열기

 O_RDWR

 읽기와 쓰기용으로 열기

 O_NONBLOCK

 비블로킹 모드로 열기

 

기존 메세지 큐를 여는데 사용하는 경우, 단지 2개의 인자만을 필요로 한다.

O_CREAT가 oflag에 명시되면 mode와 attr가 추가로 필요하다.

 

mode 인자는 I/O 블로그 부분에서 소개한 open() 함수에서 소개한 내용과 동일하다.

 

attr 인자는 새로운 메세지 큐의 속성을 명시하는 mq_attr 구조체이다. NULL로 설정되면 기본값으로

메세지 큐가 설정된다. 구조체는 아래와 같다.

 

struct mq_attr {

long mq_flags;                     /* 메세지 큐 디스크립션 플래그 0이나 O_NONBLOCK

   [mq_getattr(), mq_setattr()] */

long mq_maxmsg;                /* 큐의 최대 메세지 수 [mq_open(), mq_getattr()] */

long mq_msgsize;                /* 최대 메세지 크기 (바이트) [mq_open(), mq_getattr()] */

long mq_curmsgs;                /* 현재 큐에 있는 메세지 수 [mq_getattr()] */

};

 

3. 메세지 큐 닫기

 

메세지를 닫는다는 것은 메세지 큐를 삭제한다는 것은 아니다. 단지 메세지 큐 디스크립터를 닫는다는 것이다.  

 

#include <mqueue.h>

 

int mq_close(mqd_t mqdes);

 

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

 

4. 메세지 큐 제거

 

모든 프로세스가 해당 메세지 큐를 더 이상 사용하지 않을 경우 제거되도록 큐에 표시한다.

프로세스가 해당 메세지 큐를 더 이상 사용하지 않을 경우 즉시 제거된다.

 

#include <mqueue.h>

 

int mq_unlink(const char *name);

 

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

 

5. 메세지 큐 속성 설정 함수

 

#include <mqueue.h>

 

int mq_setattr(mqd_t mqdes, const struct mq_attr *newattr, struct mq_attr *oldattr);

 

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

 

이전 메세지 큐에 대한 설정을 알고 싶으면 oldattr를 할당하고 그렇지 않으면 NULL로 설정하면 된다.

 

6. 메세지 큐 속성 추출 함수 

 

#include <mqueue.h>

 

int mq_getattr(mqd_t mqdes, struct mq_attr *attr);

 

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

 

 

7. 주의 사항

 

mq_maxsize와 mq_msgsize 속성은 메세지 큐가 생성되는 시점에 고정되고, 차후에 변경될 수 없다.

 

위의 메세지 속성 구조체 주석문에 볼 수 있듯이 mq_setattr() 함수로 설정할 수 있는 구조체 값은

mq_flags 값이다. 일반적으로 O_NONBLOCK 값을 추가적으로 설정할 때 사용한다.

 

 

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

메세지 교환  (0) 2014.03.10
: