/************************************
函数名称:
函数功能:
参 数:
作 者:
创建日期:
修改日期:
修改原因:
********************************************/
#include <stdio.h>
#include <string.h>#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#define MSGKEY 1024
struct msgstru
{
//long msgtype;
char msgtext[2048];
};
/*子进程,监听消息队列*/
void childproc()
{
struct msgstru msgs;
int msgid,ret_value;
char str[512];
printf("Entry childproc\n");
while(1)
{
printf("step 1\n");
msgid = msgget(MSGKEY,IPC_EXCL );/*检查消息队列是否存在 */
printf("step 2\n");
if(msgid < 0)
{
printf("msq not existed! errno=%d [%s]\n",errno,strerror(errno));
continue;
}
printf("step 3\n");
/*接收消息队列*/
ret_value = msgrcv(msgid,&msgs,sizeof(struct msgstru),0,0);
printf("step 4\n");
printf("retvalue=%d \t text=%s \t pid=%d\n",ret_value,msgs.msgtext,getpid());
}
return;
}
void main()
{
int i,cpid;
/* create 5 child process */
for (i=0;i<5;i++)
{
cpid = fork();
if (cpid < 0)
printf("fork failed\n");
else if (cpid ==0)
/*child process*/
childproc();
printf("i=%d\n",i);
}
}
/************************************
函数名称:
函数功能:
参 数:
作 者:
创建日期:
修改日期:
修改原因:
********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#define MSGKEY 1024
struct msgstru
{
// int msgtype;
char msgtext[2048];
};
int main()
{
struct msgstru msgs;
int msg_type;
char str[256];
int ret_value;
int msqid;
msqid=msgget(MSGKEY,IPC_EXCL); /*检查消息队列是否存在*/
if(msqid < 0)
{
msqid = msgget(MSGKEY,IPC_CREAT|0666);/*创建消息队列*/
if(msqid <0)
{
printf("failed to create msq | errno=%d [%s]\n",errno,strerror(errno));
exit(-1);
}
}
while (1)
{
memset(&msgs,0,sizeof(msgs));
printf("input message to be sent:");
gets(str);
//msgs.msgtype = 1;
strcpy(msgs.msgtext, str);
/* 发送消息队列 */
ret_value = msgsnd(msqid,&msgs,sizeof(struct msgstru),IPC_NOWAIT);
if ( ret_value < 0 )
{
printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));
exit(-1);
}
}
msgctl(msqid,IPC_RMID,0); //删除消息队列
}