IPC - MESSAGE QUEUE

Jongwon·2021년 12월 18일
0

Linux Programming

목록 보기
22/25

메세지 큐

메세지를 저장하는 연결리스트 큐, 큐에는 독립적인 ID가 있다.

struct msgbuf {
	long mtype;
	char mtext[num];
}

int msize = sizeof(struct msgbuf) - sizeof(long)  //msize는 text크기만 본다.

long mtype: 수신 메세지 타입. type에 숫자를 지정함으로써 우선순위 지정 가능

struct msgqid_ds {
    struct ipc_perm msg_perm;  //접근 권한
    time_t msg_stime;          //마지막 메세지 전송시간
    time_t msg_rtime;          //마지막 메세지 수신시간
    time_t msg_ctime;          //마지막 변경시간
    msgqnum_t msg_qnum;        //큐의 메세지 개수
    msglen_t msg_qbytes;       //큐에 있는 메세지들의 크기
    pid_t msg_lspid;           //마지막 메세지 전송 프로세스 ID
    pid_t msg_lrpid;           //마지막 메세지 수신 프로세스 ID

메세지 큐는 사용이 끝나면 전송 프로세스와 수신 프로세스에 송수신 완료여부 물은 뒤, msgctl(msqid, IPC_RMID, 0)으로 큐를 삭제해야 한다.

<sys/msg.h> 헤더

  • int msgget(key_t key, int flag)
    메세지 큐 생성 후 ID반환, 혹은 이미 생성된 큐이면 ID반환. 실패시 -1
int key
큐 식별을 위한 번호로, 같은 키를 매개변수로 주는 다른 프로세스는 같은 메세지 큐를 받음.
IPC_PRIVATE로 주면 자신만 유일하게 사용하기 위해 아무도 모르는 key값 만들어줌.

int flag
- IPC_CREAT : key값 가지는 큐가 없으면 큐 생성 후 접근권한 부여. key 존재시 무시
- IPC_EXCL : key값 가진 큐가 있으면 -1반환(큐 반환 실패)
- 사용자 권한도 | 로 설정가능(ex: IPC_CREAT | 0666)
- 0이면 ID만 받아올때 사용
  • int msgsnd(int msqid, struct msgbuf *msgp, size_t msize, int flag)
    msize크기만큼의 msgp 메세지를 큐에 전송, 큐가 가득 차있으면 대기함.
int flag
- IPC_NOWAIT: 큐가 가득 차 전송이 불가능하면 바로 -1반환
  • int msgrcv(int msqid, struct msgbuf *msgp, size_t msize, long mtype, int flag)
    메세지 큐에서 메세지 수신. 수신한 메세지 길이 반환, msize보다 크면 -1, errno변수 설정됨.
long mtype
- 0: 메세지 큐의 첫번째 메세지 수신
- 양수: 이 값과 같은 mtype을 가진 메세지 수신
- 음수: 이 값의 절대값과 작거나 같은 메세지 타입 수신, 작을수록 먼저 수신

int flag
- IPC_NOWAIT: 큐에 메세지가 없으면 바로 -1반환(errno는 ENOMSG로 설정)
- MSG_NOERROR: 메세지 크기가 msize보다 크면 초과되는 부분은 자르고 수신.
  • int msgctl(int msqid, int cmd, struct msqid_ds *buf)
    메세지 큐 제어. cmd명령을 실행. 0이면 성공, -1이면 실패
int cmd
- IPC_STAT: 메세지 큐 정보 얻어 buf에 기록
- IPC_SET: 메세지 큐 정보를 buf에 저장한 값으로 변경(단 msg_perm과 msg_qbytes만 변경가능)
- IPC_RMID: 메세지 큐 제거(꼭 통신 끝나면 제거해야함)
profile
Backend Engineer

0개의 댓글