반응형

msgctl(2)

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

msgctl(2)함수는 msqid의 System V message queue에 대해서 cmd 명령어로 message queue 정보를 조회/변경 및 삭제 작업을 수행합니다.

 

 

파라미터

msgid
    - msgget(2)가 return한 msqid 
cmd
    - Message Queue에 대해서 처리하려는 명령어 코드

 IPC_STAT : msqid로 생성된 Message Queue의 정보를 읽어서 buf 구조체에 저장합니다.

 IPC_SET  : msqid로 생성된 Message Queue의 정보 중에서 
            msg_perm.uid, msg_perm.gid, msg_perm.mode와 msg_ctime의 값을 변경할 수 있습니다.
            만약 process가 root권한으로 실행하고 있다면, msg_qbytes 값도 변경할 수 있습니다. 
            (구조체 정보는 argument buf 참조)

 IPC_RMID : msqid로 생성된 Message Queue를 삭제합니다. 
            Message Queue를 읽기 또는 쓰기로 blocking된 프로세스에서는 EIDRM(errno값) 오류가 발생합니다.
           삭제는 삭제권한이 있는 user가 실행했을 때에만 삭제됩니다. argument buf값은 무시됩니다.
buf
    - cmd의 (IPC_STAT, IPC_SET, IPC_RMID)값에 따라 struct msqid_ds는 읽기용/쓰기용/무시됩니다.

struct msqid_ds 구조체

struct msqid_ds {
   struct ipc_perm msg_perm;     /* Ownership and permissions */
   time_t          msg_stime;    /* Time of last msgsnd(2) */
   time_t          msg_rtime;    /* Time of last msgrcv(2) */
   time_t          msg_ctime;    /* Time of last change */
   unsigned long   __msg_cbytes; /* Current number of bytes in queue (nonstandard) */
   msgqnum_t       msg_qnum;     /* Current number of messages in queue */
   msglen_t        msg_qbytes;   /* Maximum number of bytes allowed in queue */
   pid_t           msg_lspid;    /* PID of last msgsnd(2) */
   pid_t           msg_lrpid;    /* PID of last msgrcv(2) */
};

struct ipc_perm {
   key_t          __key;       /* Key supplied to msgget(2) */
   uid_t          uid;         /* Effective UID of owner */
   gid_t          gid;         /* Effective GID of owner */
   uid_t          cuid;        /* Effective UID of creator */
   gid_t          cgid;        /* Effective GID of creator */
   unsigned short mode;        /* Permissions */
   unsigned short __seq;       /* Sequence number */
};

 

RETURN

 -1이 아님
    - 정상적으로 실행되었습니다.

-1
    - 오류가 발생하였으며, 상세한 오류내용은 errno 변수에 설정됩니다.

 EACCES : cmd가 IPC_STAT일 때에 msqid에 대해서 읽기 권한이 없습니다.
 EFAULT : cmd가 IPC_SET 또는 IPC_STAT의 경우 buf가 접근할 수 없는 주소입니다.
 EIDRM  : msqid가 삭제된 id입니다.
 EINVAL : msqid가 유효하지 않은 ID이거나 cmd가 유효하지 않은 명령어입니다.
 EPERM  : cmd가 IPC_SET 또는 IPC_RMID일 때에 현재 실행중인 프로셋의 effective user ID가 
          shared memory를 생성한 user가 아니거나 owner가 아니어서 변경권한이 없습니다.

 


활용 예제

 

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

int main(int argc, char *argv[])
{
   int qid;
   int msgkey;
   char dir[256];

   /* Message Queue의 key를 생성합니다. */
   snprintf(dir, 256, "%s/msg_home", getenv("HOME"));
   msgkey = ftok(dir, 'M');

   /* 이미 생성한 Message Queue ID를 얻습니다. */
   if((qid = msgget(msgkey, 0666)) == -1) {
       perror("msgget error");
	   return 1;
   }

   /*  Message Queue를 삭제합니다.  */
   if (msgctl(qid, IPC_RMID, NULL) == -1) {
       perror("msgctl error");
       exit(1);
   }

   return 0;
}

 

반응형
블로그 이미지

자연&사람

행복한 개발자 programmer since 1995.

,