msgget(2)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
key로 구성된 System V message queue ID를 생성합니다. msgflg가 IPC_CREAT이고 key의 값이 IPC_PRIVATE이면, 임의의 key값으로 새로운 message queue ID가 생성됩니다. 이 경우에 실제 key값은 msgctl(2)을 통해서 읽어야 하며, 읽은 key값은 다른 프로세스에서 사용할 수 있도록 key를 공유할 방법을 제공해야 합니다.
(예를들면, 프로세스간에 정해진 파일에 write해두고, 다른 프로세스에서 읽어서 msgget(2)의 key로 사용해야 합니다.)
msgflg가 IPC_CREAT이고 key로 이미 생성된 message queue가 있으면 이미 생성된 message queue ID를 return합니다.
msgflg가 IPC_CREAT | IPC_EXCL 이면, key로 이미 생성된 message queue가 존재하면 EEXIST 오류가 발생합니다.
msgflg는 IPC_CREAT가 설정되지 않으면, key로 이미 생성된 message queue ID를 return하며, 이미 생성된 message queue가 없으면 ENOENT 오류가 발생합니다.
msgflg는 IPC_CREAT, IPC_EXCL과 open(2) 또는 creat(2)함수의 mode에 설정하는 권한을 9bit로 bit or 연산으로 설정할 수 있습니다.
즉, msgflg에는 message queue에 대한 접근 권한을 0666과 같이 설정할 수 있습니다. 이 권한 값은 umask(2)의 영향을 받지 않습니다.
파라미터
key
- message queue를 구분하는 key값.
- key의 값은 임의의 정수를 사용하거나, ftok(3)의 함수를 통해서 생성된 key를 사용할 수 있습니다.
- key값을 IPC_PRIVATE로 설정하면 항상 새로운 message queue id를 생성하며,
생성된 message queue id는 다른 프로세스에 전달할 수 있는 방안을 마련해야 합니다.
(예, 파일로 저장하여 공유)
msgflg
- message queue 생성 권한 및 신규 생성 여부를 설정합니다.
IPC_CREAT : key값으로 생성된 message queue가 존재하지 않으면 message queue를 신규로 생성합니다.
IPC_CREAT를 설정하지 않으면, 이미 생성된 message queue ID를 return하고,
이미 생성되어 있지 않았으면 오류가 발생합니다.
IPC_EXCL : 이미 생성된 message queue가 있으면 오류를 발생합니다.
권한값 : open(2) 또는 creat(2)함수의 mode값처럼 message queue의 접근 권한을 9 bit 설정할 수 있습니다.
주의: IPC_PRIVATE는 msgflg에 설정하는 값이 아니라 key에 설정하는 값입니다.
예).
IPC_CREAT | IPC_EXCL | 0666 : 없으면 새로 생성하고, 있으면 오류를 발생시킵니다.
접근 권한은 0666입니다.
IPC_CREAT | 0666 : 없으면 새로 생성하고,
이미 생성되어 있으면 이미 생성된 message queue ID를 return 합니다.
0 : 이미 생성된 message queue ID를 return합니다. 없으면 오류발생합니다.
RETURN
-1이 아님
- 생성된 message queue id
-1
- 오류가 발생하였으며, 상세한 오류내용은 errno에 설정됩니다.
EACCES : 프로세스의 user가 접근 권한이 없습니다.
EEXIST : msgflg IPC_CREAT | IPC_EXCL option이 추가되었으며,
key로 이미 생성된 message queue가 존재합니다.
ENOENT : IPC_CREAT가 msgflg에 설정되지 않았고, key로 생성된 message queue가 존재하지 않습니다.
ENOMEM : 메모리가 부족합니다.
ENOSPC : System에서 정의한 최대 message queues 갯수(SHMMNI)에 도달하였습니다.
활용 예제
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
/* 사용자 데이터 정의 하기 */
struct my_data
{
char data1[100];
/*
......
*/
};
struct msgbuf
{
long mtype;
struct my_data body;
};
int main(int argc, char *argv[])
{
int qid;
int msgtype = 1;
int msgkey;
struct msgbuf msg;
char send_data[100];
char dir[256];
/* Message Queue의 key를 생성합니다. */
snprintf(dir, 256, "%s/msg_home", getenv("HOME"));
msgkey = ftok(dir, 'M');
/* Message Queue를 생성합니다. */
if((qid = msgget(msgkey, IPC_CREAT | 0666)) == -1) {
perror("msgget error");
return 1;
}
memset(&msg, 0x00, sizeof(msg));
msg.mtype = msgtype;
......
strncpy(msg.body.data1, send_data, 100);
......
/* 전송하는 데이터의 크기는 mtype 부분은 빼고 body 부분의 크기입니다. */
if (msgsnd(qid, (void *) &msg, sizeof(struct msgbuf), IPC_NOWAIT) == -1) {
perror("msgsnd error");
exit(1);
}
return 0;
}
'C언어 header > sys | msg.h' 카테고리의 다른 글
msgrcv(2) -System V Message Queue에서 데이터 수신 (0) | 2019.09.29 |
---|---|
msgsnd(2) - System V Message Queue로 데이터 전송 (0) | 2019.09.29 |
msgctl(2) - System V message queue 제어 (0) | 2019.09.29 |