메세지 큐 열기 및 종료
System Program/message queue 2014. 3. 10. 12:011. 개요
메세지 큐는 프로세스간에 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로 설정되면 기본값으로
메세지 큐가 설정된다. 구조체는 아래와 같다.
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 |
---|