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 |