在linux中,msgsnd和msgrcv函数是用来进行消息通讯的.
其中msgrcv的函数原型如下:
int msgrcv(int msgid,struct msgbuf *msgp,int msgsz, long msgtype,int msgflg);
msgid是接受或者发送的消息队列标志.
msgp是接受或者发送的内容.
msgsz是消息的大小. 结构
msgbuf包含的内容是至少有一个为msgtype.
其他的成分是用户定义的.
接收函数msgtype指出接收消息时候的操作.
如果msgtype=0,接收消息队列的第一个消息;大于0接收队列中消息类型等于这个值的第
一个消息;小于0接收消息队列中小于或者等于msgtype绝对值的所有消息中的最小一个消 息
下面我们举一个例子,关于msgtype小于0的使用方法。
程序包含发送端msg2,接收端msg1,发送端每发送一次消息,消息类型就减1,开始消息类型是10,
接收端接收消息类型小于等于8的消息,因此,可以用两种方式运行例子:
方式一:在一个终端中先运行msg2程序,连续发送几次消息,然后保持msg2不变,开启另一个终端,运行msg1程序,则会发现接收端msg1会收到刚刚从发送端发送过来的消息,而且接收的消息类型是小于等于8的,并且是逆序接收的。
方式二:在一个终端中运行msg2程序,打开另一个终端运行msg1程序,在msg2中发送消息,当发送消息类型小于等于8时,接收端msg1将显示接收消息。
- //接收端msg1代码:
-
-
#include <stdlib.h>
-
-
#include <stdio.h>
-
-
#include <string.h>
-
-
#include <errno.h>
-
-
#include <unistd.h>
-
-
#include <sys/msg.h>
-
-
struct my_msg_st {
-
-
long int my_msg_type;
-
-
char some_text[BUFSIZ];
-
-
};
-
-
int main()
-
-
{
-
-
int running = 1;
-
-
int msgid;
-
-
struct my_msg_st some_data;
-
-
long int msg_to_receive = -8; //接收消息类型
-
-
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
-
-
if (msgid == -1) {
-
-
fprintf(stderr, "msgget failed with error: %d\n", errno);
-
-
exit(EXIT_FAILURE);
-
-
}
-
-
while(running) {
-
-
if (msgrcv(msgid, (void *)&some_data, BUFSIZ,
-
-
msg_to_receive, 0) == -1) {
-
-
fprintf(stderr, "msgrcv failed with error: %d\n", errno);
-
-
exit(EXIT_FAILURE);
-
-
}
-
-
printf("You wrote: %s", some_data.some_text);
-
-
if (strncmp(some_data.some_text, "end", 3) == 0) {
-
-
running = 0;
-
-
}
-
-
}
-
-
if (msgctl(msgid, IPC_RMID, 0) == -1) {
-
-
fprintf(stderr, "msgctl(IPC_RMID) failed\n");
-
-
exit(EXIT_FAILURE);
-
-
}
-
-
exit(EXIT_SUCCESS);
-
-
}
-
-
-
- //发送端msg2代码:
-
-
#include <stdlib.h>
-
-
#include <stdio.h>
-
-
#include <string.h>
-
-
#include <errno.h>
-
-
#include <unistd.h>
-
-
#include <sys/msg.h>
-
-
#define MAX_TEXT 512
-
-
struct my_msg_st {
-
-
long int my_msg_type;
-
-
char some_text[MAX_TEXT];
-
-
};
-
-
int main()
-
-
{
-
-
int i = 10;
-
-
int running = 1;
-
-
struct my_msg_st some_data;
-
-
int msgid;
-
-
char buffer[BUFSIZ];
-
-
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
-
-
if (msgid == -1) {
-
-
fprintf(stderr, "msgget failed with error: %d\n", errno);
-
-
exit(EXIT_FAILURE);
-
-
}
-
-
while(running) {
-
-
printf("Enter some text: ");
-
-
fgets(buffer, BUFSIZ, stdin);
-
-
some_data.my_msg_type = i--;
-
-
strcpy(some_data.some_text, buffer);
-
-
if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) {
-
-
fprintf(stderr, "msgsnd failed\n");
-
-
exit(EXIT_FAILURE);
-
-
}
-
-
if (strncmp(buffer, "end", 3) == 0) {
-
-
running = 0;
-
-
}
-
-
}
-
-
exit(EXIT_SUCCESS);
-
-
}
运行方式一:
运行方式二: