728x90
프로세스, 스레드, 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)
- 메세지 수신
728x90
'운영체제 > IPC' 카테고리의 다른 글
[OS] Signaling (0) | 2022.12.26 |
---|---|
[OS] IPC - Shared Memory (0) | 2022.12.26 |