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
반응형
'프로그래밍 > ExampleCode.com' 카테고리의 다른 글
| [IPC] shared memory 예제 코드 (5) | 2018.09.20 |
|---|---|
| [IPC] pipe 예제 코드 (0) | 2018.09.20 |
| [IPC] named pipe 예제 코드 (0) | 2018.09.20 |
| [IPC] 메모리 맵 mmap() 예제 코드 (0) | 2018.09.20 |
| [fseek] 파일 포인터이동 예제 (0) | 2018.08.27 |