Linux 进程间通讯详解五

msgrcv函数
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
--功能:是从一个消息队列接收消息
--参数:
    msqid:由msgget函数返回的消息队列标识码
    msgp:是一个指针,指针指向准备接收的消息
    msgsz:是msgp指向的消息长度,这个长度不含保存消息类型的那个long int长整型
    msgtype:它可以实现接收优先级的简单形式
    msgflg:控制着队列中没有相应类型的消息可供接收时将要发生的事
--成功返回实际放到接收缓冲区里的字符个数(不包含保存消息类型的那个long int 长整型),失败返回-1并且设置errno
--msgtype=0返回队列第一条信息
--msgtype>0返回队列第一条类型msgtype的消息
--msgtype<0返回队列第一条类型小于等于msgtype绝对值得消息,并且是满足条件的消息类型最小的消息
--msgflg=IPC_NOWAIT,队列没有可读消息不等待,直接返回RNOMSG错误,
--msgflg=0,队列有可读消息,直接读取,没有可读消息,继续等待,直到有消息过来再接收。
--msgflg=MSG_NOERROR,消息大小超过msgsz时被截断
--msgtype>0且msgflg=MSG_EXCEPT,接收类型等于msgtype的第一条信息。
//消息队列--msgrcv()函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

//接收消息的结构体
struct msgbuf
{
    long mtype; /* message type, must be > 0 */
    char mtext[1024]; /*这是占位符,由程序员自己决定发送消息的数组长度 */
};

int main(int arg, char * args[])
{
    int ret = 0;
    if (arg < 2)
    {
        printf("please print one params !
");
        return -1;
    }
    int type=atoi(args[1]);
    int msqid = msgget(0x1234, 0666);
    if (msqid == -1)
    {
        perror("msgget() err");
        return -1;
    }
    printf("访问消息队列成功!msqid=%d
", msqid);
    //接收消息
    struct msgbuf buf2;
    memset(&buf2, 0, sizeof(buf2));
    ret = msgrcv(msqid, &buf2, 1024, type, 0);
    if (ret == -1)
    {
        perror("msgrcv() err");
        return -1;
    }
    printf("mtext=%s
", buf2.mtext);
    return 0;
}
原文地址:https://www.cnblogs.com/zhanggaofeng/p/6201907.html