Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95937
  • 博文数量: 67
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 15:34
文章分类
文章存档

2015年(1)

2014年(6)

2013年(10)

2012年(50)

我的朋友

分类:

2012-12-07 15:09:23

msgrcv函数中msgtype的使用

在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将显示接收消息。

  1. //接收端msg1代码:

  2. #include <stdlib.h>

  3. #include <stdio.h>

  4. #include <string.h>

  5. #include <errno.h>

  6. #include <unistd.h>

  7. #include <sys/msg.h>

  8. struct my_msg_st {

  9.     long int my_msg_type;

  10.     char some_text[BUFSIZ];

  11. };

  12. int main()

  13. {

  14.     int running = 1;

  15.     int msgid;

  16.     struct my_msg_st some_data;

  17.     long int msg_to_receive = -8; //接收消息类型

  18.     msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

  19.     if (msgid == -1) {

  20.         fprintf(stderr, "msgget failed with error: %d\n", errno);

  21.         exit(EXIT_FAILURE);

  22.     }

  23.     while(running) {

  24.         if (msgrcv(msgid, (void *)&some_data, BUFSIZ,

  25.                    msg_to_receive, 0) == -1) {

  26.             fprintf(stderr, "msgrcv failed with error: %d\n", errno);

  27.             exit(EXIT_FAILURE);

  28.         }

  29.         printf("You wrote: %s", some_data.some_text);

  30.         if (strncmp(some_data.some_text, "end", 3) == 0) {

  31.             running = 0;

  32.         }

  33.     }

  34.     if (msgctl(msgid, IPC_RMID, 0) == -1) {

  35.         fprintf(stderr, "msgctl(IPC_RMID) failed\n");

  36.         exit(EXIT_FAILURE);

  37.     }

  38.     exit(EXIT_SUCCESS);

  39. }

  40.  


  1. //发送端msg2代码:

  2. #include <stdlib.h>

  3. #include <stdio.h>

  4. #include <string.h>

  5. #include <errno.h>

  6. #include <unistd.h>

  7. #include <sys/msg.h>

  8. #define MAX_TEXT 512

  9. struct my_msg_st {

  10.     long int my_msg_type;

  11.     char some_text[MAX_TEXT];

  12. };

  13. int main()

  14. {

  15.     int i = 10;

  16.     int running = 1;

  17.     struct my_msg_st some_data;

  18.     int msgid;

  19.     char buffer[BUFSIZ];

  20.     msgid = msgget((key_t)1234, 0666 | IPC_CREAT);

  21.     if (msgid == -1) {

  22.         fprintf(stderr, "msgget failed with error: %d\n", errno);

  23.         exit(EXIT_FAILURE);

  24.     }

  25.     while(running) {

  26.         printf("Enter some text: ");

  27.         fgets(buffer, BUFSIZ, stdin);

  28.         some_data.my_msg_type = i--;

  29.         strcpy(some_data.some_text, buffer);

  30.         if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) {

  31.             fprintf(stderr, "msgsnd failed\n");

  32.             exit(EXIT_FAILURE);

  33.         }

  34.         if (strncmp(buffer, "end", 3) == 0) {

  35.             running = 0;

  36.         }

  37.     }

  38.     exit(EXIT_SUCCESS);

  39. }

运行方式一:



运行方式二:

阅读(1015) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~