Linux 进程间通信(system v 消息队列, 阻塞式)实(2)

/*
 *
 *       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;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/23340.html