/*
*
* Filename: consumer.c
*
* Description: 消费者进程
*
* Version: 1.0
* Created: 09/30/2011 04:52:23 PM
* Revision: none
* Compiler: gcc(g++)
*
* Author: |Zhenghe Zhang|, |zhenghe.zhang@gmail.com|
* Company: |Shenzhen XXX Technology Co., Ltd.|
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <error.h>
#define BUFFER 10 //定义buf大小
struct msgtype {
long mtype;
char buf1[BUFFER + 1];
char buf2[BUFFER + 1];
long size;
};
int main()
{
key_t msgkey;
/*消息队列*/
int msgid;
struct msgtype msg;
msgkey = ftok("/home/zhang/shmipcx", 10001);
if(msgkey == -1)
{
perror("ftok");
exit(1);
}
msgid = msgget(msgkey, IPC_EXCL | 0666);
if(msgid == -1)
{
perror("msgget");
exit(1);
}
int i = 0;
while(i < 10) //运行一个consumenr,为 10 ,同时运行两个consumer进程,为 5
{
memset(msg.buf1, 0, BUFFER + 1);
memset(msg.buf2, 0, BUFFER + 1);
msg.mtype = 1001;
msg.size = -1;
/*从标识符为msqid的消息队列读取消息并存于msgp中,读取后把此消息从消息队列中删除*/
/*msgp 存放消息的结构体,结构体类型要与msgsnd函数发送的类型相同*/
/*msgsz 要接收消息的大小,不含消息类型占用的4个字节*/
/*msgtyp 0 接收第一个消息*/
/*msgtyp <0 接收类型等于或者小于msgtyp绝对值的第一个消息*/
/*msgtyp >0 接收类型等于msgtyp的第一个消息*/
/*msgflg 0 阻塞式接收消息,没有该类型的消息msgrcv函数一直阻塞等待*/
/*msgflg IPC_NOWAIT 如果没有返回条件的消息调用立即返回,此时错误码为ENOMSG*/
/*msgflg IPC_EXCEPT 与msgtype配合使用返回队列中第一个类型不为msgtype的消息*/
/*msgflg IPC_NOERROR 如果队列中满足条件的消息内容大于所请求的size字节,则把该消息截断,截断部分将被丢弃*/
if(msgrcv(msgid, &msg, sizeof(struct msgtype) - sizeof(long), msg.mtype, 0) == -1)
{
perror("msgrcv");
exit(1);
}
printf("msg.mtype = %ld, msg.size = %ld\t", msg.mtype, msg.size);
printf("msg.buf1 = %s, msg.buf2 = %s\n", msg.buf1, msg.buf2);
i++;
sleep(2);
}
return 0;
}