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