[OS] IPC - Message Passing

·2020년 9월 30일
0

프로세스, 스레드, IPC에 관한 내용은 이 글을 참고하자

Message Passing 예제

sender.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFFER_SIZE 1024

// 메세지 형태 정의
typedef struct {
  long msgtype;
  int value;
  char buf[BUFFER_SIZE];
} msgbuf;

int main() {
  int key_id;
  msgbuf mybuf;
  int count = 0;
 
  // 메세지 생성
  key_id = msgget((key_t) 1234, IPC_CREAT|0666);
  if (key_id == -1) {
    perror("msgget() error");
    exit(0);
  }
  
  // 메세지 타입 설정
  mybuf.msgtype = 1;
  while (1) {
    // value 값 1 증가시켜서 메세지 전송
    mybuf.value = count++;
    printf("value : %d\n", mybuf.value);
    
    if (msgsnd(key_id, &mybuf, sizeof(msgbuf), IPC_NOWAIT) == -1) {
      perror("msgsnd() error");
      exit(0);
    }
    
    sleep(10);
  }
}

receiver.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define BUFFER_SIZE 1024

// 메세지 형태 정의
typedef struct {
  long msgtype;
  int value;
  char buf[BUFFER_SIZE];
} msgbuf;

int main() {
  int key_id;
  msgbuf mybuf;
  long msgtype = 1; // 수신받을 메세지 타입 미리 설정
 
  // 메세지 생성
  key_id = msgget((key_t) 1234, IPC_CREAT|0666);
  if (key_id == -1) {
    perror("msgget() error");
    exit(0);
  }
  
  while (1) {
    // 메세지 타입이 1 일 때 수신
    if (msgrcv(key_id, &mybuf, sizeof(msgbuf), 1, 0) == -1) {
      perror("msgrcv() error");
      exit(0);
    }
    
    // 수신 받은 메세지에서 value 출력
    printf("value : %d\n", mybuf.value);
  }
}

실행화면

헤더 파일 및 주요 함수

헤더 파일

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

int msgget(key_t key, int msgflg)

  • 메세지를 생성

int msgsnd(int msqid, struct msgbuf * msgp, size_t msgsize, int msgflg)

  • 메세지 전송

ssize_t msgrcv(int msgid, struct msgbuf * msgp, size_t msgsize, long msgtype, int msgflg)

  • 메세지 수신
profile
https://devhdong.tistory.com 로 이전되었습니다.

1개의 댓글

comment-user-thumbnail
2021년 3월 4일

잘봤습니다. 메세지 패싱을 이해하기 좋은 예제인 것 같네요..!

답글 달기