作家
登录

Linux进程间通信——使用消息队列

作者: 来源: 2017-06-19 15:49:28 阅读 我要评论

  •  
  •     }   
  •  
  •    
  •  
  •     //向消息队列中写消息,直到写入end   
  •  
  •     while(running)   
  •  
  •     {   
  •  
  •         //输入数据   
  •  
  •         printf("Enter some text: ");   
  •  
  •         fgets(buffer, BUFSIZ, stdin);   
  •  
  •         data.msg_type = 1;    //留意2   
  •  
  •         strcpy(data.text, buffer);   
  •  
  •         //向队列发送数据   
  •  
  •         if(msgsnd(msgid, (void*)&data, MAX_TEXT, 0) == -1)   
  •  
  •         {   
  •  
  •             fprintf(stderr, "msgsnd failed\n");   
  •  
  •             exit(EXIT_FAILURE);   
  •  
  •         }   
  •  
  •         //输入end停止输入   
  •  
  •         if(strncmp(buffer, "end", 3) == 0)   
  •  
  •             running = 0;   
  •  
  •         sleep(1);   
  •  
  •     }   
  •  
  •     exit(EXIT_SUCCESS);   
  •  
  • }    
  • 运行结不雅如下:

    四、例子分析——消息类型

    这里重要解释一下消息类型是怎么一回事,留意msgreceive.c文件main函数中定义的变量msgtype(注释为留意1),它作为msgrcv函数的接收信息类型参数的值,其值为0,表示获取队列中第一个可用的消息。再来看看msgsend.c文件中while轮回中的语句data.msg_type = 1(注释为留意2),它用来设置发送的信息的信息类型,即其发送的信息的类型为1。所以法度榜样msgreceive可以或许接收到法度榜样msgsend发送的信息。

    如不雅把留意1,即msgreceive.c文件main函数中的语句由long int msgtype = 0;改变为long int msgtype = 2;会产生什么情况,msgreceive将不克不及接收到法度榜样msgsend发送的信息。因为在调用msgrcv函数时,如不雅msgtype(第四个参数)大年夜于零,则将只获取具有雷同消息类型的第一个消息,修改后获取的消息类型为2,而msgsend发送的消息类型为1,所以不克不及被msgreceive法度榜样接收。从新编译msgreceive.c文件并再次履行,其结不雅如下:

    我们可以看到,msgreceive并没有接收到信息和输出,并且当msgsend输入end停止后,msgreceive也没有停止,经由过程jobs敕令我们可以看到它还在后台运行着。


      推荐阅读

      Windows 10 Build 16215带来的11大Fall Creators Update最佳功能_IT技术周刊第506期

    【义务编辑:刘晶晶 TEL:(010)68476606】 >>>详细阅读


    本文标题:Linux进程间通信——使用消息队列

    地址:http://www.17bianji.com/lsqh/35826.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)