본문 바로가기

UNIX_LINUX_C_C++

메시지큐 사용예제

#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;
};

int main()
{
key_t key_id;
int i;
struct _msgbuf mybuf, rcvbuf;

key_id = msgget((key_t)1234, IPC_CREAT|0666);
if (key_id == -1)
{
perror("msgget error : ");
exit(0);
}

printf("Key is %d\n", key_id);

memset(mybuf.mtext, 0x00, 256);
memset(mybuf.myname, 0x00, 16);
memcpy(mybuf.mtext, "hello world 4", 13);
memcpy(mybuf.myname, "yundream", 8);
mybuf.seq = 0;
i = 0;

while(1)
{
// 짝수일경우 메시지 타입이 4
// 홀수일경우에는 메시지 타입이 3
if (i % 2 == 0)
mybuf.msgtype = 4;
else
mybuf.msgtype = 3;
mybuf.seq = i;

// 메시지를 전송한다.
if (msgsnd( key_id, (void *)&mybuf, sizeof(struct _msgbuf), IPC_NOWAIT) == -1)
{
perror("msgsnd error : ");
exit(0);
}
printf("send %d[%s]\n", i, mybuf.mtext);
i++;
sleep(1);
}

printf("%d \n", rcvbuf.msgtype);
printf("%s \n", rcvbuf.mtext);
printf("%s \n", rcvbuf.myname);
exit(0);
}

/********************************************************************************************/

#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;
};

int main(int argc, char **argv)
{
key_t key_id;
struct _msgbuf mybuf;
int msgtype;//전역변수로 빼야 됩니다.
int errType = 0;

// 아규먼트가 있을경우 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 : ");
exit(0);
}

msgtype = 0;

while(1)
{
errType = msgrcv( key_id, (void *)&mybuf, sizeof(struct _msgbuf), msgtype, IPC_NOWAIT);
if (mybuf.mtext[0] == '\0')
{
continue;
}
printf("[%d][%s]\n", mybuf.seq, mybuf.mtext);
memset(&mybuf, 0x00, sizeof(mybuf));
}
exit(0);
}

/***********************************************************************************************/

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

/* 수신할 message queue 구조체 */
struct msg_buf{
long msgtype;
char mtext[256];
char myname[16];
int seq;
};


int main(int argc,char *argv[]){

key_t queue_id;
int msg_queue_id,type;
struct msg_buf rcvbuf;

/* 유일한 key 생성 */
queue_id = 0x209; ftok(".",'m');

/* 필요하다면 queue를 만들고 연다 */
if((msg_queue_id = msgget(queue_id,IPC_CREAT|0660)) < 0){
perror("msgget error!:");
exit(1);
}
printf("Key is %d\n",msg_queue_id);

rcvbuf.msgtype = 1;
type = rcvbuf.msgtype ;

while(rcvbuf.mtext != "quit"){

/***** message 수신 *******************************************************/

if(msgrcv( msg_queue_id,(void *)&rcvbuf,sizeof(struct msg_buf),type,0) < 0){
perror("msgrcv error!:");
exit(1);
};

printf("To( %s) -",rcvbuf.myname);
printf("Message : %s\n",rcvbuf.mtext);

printf("To( %s) -",rcvbuf.myname);
printf("Message : %s\n",rcvbuf.mtext);

/***** message 수신 종료 **************************************************/

}
/* queue 제거*/
if(msgctl( msg_queue_id,IPC_RMID,0) < 0){
perror("msgctl error!");
exit(1);
}

exit(0);
}