프로그래밍/ExampleCode.com

[IPC] message queue 예제 코드

jinkwon.kim 2018. 9. 20. 23:35
728x90
반응형

[IPC] message queue 예제 코드


1. 구조 

  - message queue는 생상자와 소비자 구조로 되어있다. 

  - 자세한 설명은 다음 포스트 참조 

   [프로세스간 통신] IPC(inter process communication) 종류


2. message_queue_constructer.예제 코드

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h> 
#include <sys/msg.h> 
#include <sys/stat.h> 

struct msgbuf
{
  // 이부분은 고정!!!!
  long msgtype;      
  // 아래 부분은 모두 변경 가능
  char mtext[256];  
  char myname[16];
  int  seq;
};

struct msgbuf1
{
  // 이부분은 고정!!!!
  long msgtype;      
  // 아래 부분은 모두 변경 가능
  char ip[128];  
  char host[16];
  int  seq;
};


int main(void)
{
  key_t key_id;
  int i;
  struct msgbuf mybuf;
  struct msgbuf1 mybuf1;


  // 1. Message Queue 할당.
  key_id = msgget((key_t)1234, IPC_CREAT|0666);
  if (key_id == -1)
  {
    perror("msgget error : ");
    return 0;
  }
  // 2. 할당된 ID 확인
  printf("Key is %d\n", key_id);

  mybuf.seq = 0;
  i = 0;
  while (1) {
    memset(&mybuf, 0, sizeof(struct msgbuf));
    memset(&mybuf1, 0, sizeof(struct msgbuf1));


    // 짝수일경우 메시지 타입이 4
    // 홀수일경우에는 메시지 타입이 3
    if (i % 2 == 0) {
      mybuf.msgtype = 4;
      snprintf(mybuf.mtext, sizeof(mybuf.mtext), "hello [%d]",i);
      snprintf(mybuf.myname, sizeof(mybuf.myname), "name [%d]",i);
      mybuf1.seq = i;
      mybuf.seq = i;
      // 3. 메시지를 전송한다. 
      if (msgsnd( key_id, (void *)&mybuf, sizeof(struct msgbuf), IPC_NOWAIT) == -1)
      {
        perror("msgsnd error : ");
        return 0;
      } 
    } else {
      mybuf1.msgtype = 3;
      snprintf(mybuf1.ip, sizeof(mybuf1.ip), "10.0.8.%d",i);
      snprintf(mybuf1.host, sizeof(mybuf1.host), "ip[%d]",i);
      mybuf1.seq = i;
      // 3. 메시지를 전송한다. 
      if (msgsnd( key_id, (void *)&mybuf1, sizeof(struct msgbuf1), IPC_NOWAIT) == -1)
      {
        perror("msgsnd error : ");
        return 0;
      } 
    }

    printf("send %d\n", i);
    i++;
    sleep(1);
  }
  return 0;
}



3. message_queue_consumer 예제 코드

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

struct msgbuf {
 // 이부분은 고정!!!!
    long msgtype;
    // 아래 부분은 모두 변경 가능
    char mtext[256];
    char myname[16];
    int  seq;
};

struct msgbuf1 {
  // 이부분은 고정!!!!
  long msgtype;      
  // 아래 부분은 모두 변경 가능
  char ip[128];  
  char host[16];
  int  seq;
};



int main(int argc, char **argv)
{
    key_t key_id;
    struct msgbuf mybuf;
    struct msgbuf1 mybuf1;

    int msgtype;//전역변수로 빼야 됩니다.

    // 아규먼트가 있을경우 msgtype 가 3인 메시지를 받아오고(홀수) 
    // 아규먼트가 없을경우 msgtype 가 4인 메시지를 받아온다(짝수)  
    if (argc == 2)
        msgtype = 3;
    else 
        msgtype = 4;

    key_id = msgget(1234, IPC_CREAT|0666);
    if (key_id < 0) {
        perror("msgget error : ");
        return 0;
    }
    while(1) {
      if (msgtype == 3) {
        if (msgrcv( key_id, (void *)&mybuf1, sizeof(struct msgbuf1), msgtype, 0) == -1)
        {
          perror("msgrcv error : ");
          return 0;
        }
        printf("%s %d\n",mybuf1.host, mybuf1.seq);
      } else {
        if (msgrcv( key_id, (void *)&mybuf, sizeof(struct msgbuf), msgtype, 0) == -1)
        {
          perror("msgrcv error : ");
          return 0;
        }
        printf("%s %d\n",mybuf.mtext, mybuf.seq);
      }
    }
    return 0;
}


728x90
반응형