프로세스 사이의 통신 - 메시지 큐

이동욱

2021/08/15

Categories: 네트워크

메시지 큐


// oflag에 O_CREAT가 명시된 경우
mqd_t mq_open(const char *name, int oflag, mode_t mode, struct mq_attr *attr);

// oflag에 O_CREAT가 명시되지 않은 경우
mqd_t mq_open(const char *name, int oflag);
struct mq_attr {
  long mq_flags; // 메시지 큐의 블록, 논블록 설정 여부
  long mq_maxmsg; // 메시지 큐에 저장될 수 있는 메시지의 최대 수
  long mq_msgsize; // 메시지의 최대 사이즈 (바이트)
  long mq_curmsgs; // 메시지 큐에 들어있는 메시지의 수
}
int mq_getattr(mqd_t mqd, struct mq_attr *attr);
int mq_send(mqd_t mqd, const char *ptr, size_t len, unsigned int prio);
ssize_t mq_receive(mqd_t mqd, char *ptr, size_t len, unsigned int *prio);

예제

  • 프로그램은 자식 프로세스를 하나 생성한다.
  • 자식 프로세스는 사용자에게 문자열을 입력 받은 후에 메시지 큐를 이용하여 부모 프로세스에게 전송한다.
  • 부모 프로세스는 화면에 전송받은 문자열을 출력한다.
#include <stdio.h>
#include <mqueue.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

#define MQ_NAME "/test_mq"

int main(int argc, char **argv)
{
  mqd_t mqfd;
  int pid;
  unsigned int priority = 10;
  char send_buff[50];
  void *read_buff;
  int read_len;

  struct mq_attr attr;
  attr.mq_flags = 0;
  attr.mq_maxmsg = 10;
  attr.mq_msgsize = 10;

  mqfd = mq_open(MQ_NAME, O_CREAT|O_RDWR, 644, &attr);
  if (mqfd == (mqd_t)-1)
  {
    perror("mq_open failure from main");
    printf("Errno = %d\n",errno);
    exit(0);
  }

  pid = fork();
  if (pid == 0) {
    printf("child: ");
    scanf("%s", send_buff);
    if (mq_send(mqfd, send_buff, strlen(send_buff), priority) == -1) {
      fprintf(stderr, "MQ SEND ERROR\n");
      exit(1);
    }
  } else if (pid < 0) {
    fprintf(stderr, "FORK FAILURE\n");
    exit(1);
  } else {
    if (mq_getattr(mqfd, &attr) == -1) {
      fprintf(stderr, "MQ_GET_ATTR ERROR \n");
      exit(1);
    }
    read_buff = malloc(attr.mq_msgsize);
    read_len = mq_receive(mqfd, read_buff, attr.mq_msgsize, &priority);
    printf("parent receives: %s\n", (char*)read_buff);
  }
  return 0;
}

참고 문헌


>> Home