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;
}

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요