`
CJxixi
  • 浏览: 106681 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

linux 消息队列 实例

 
阅读更多

前言:

   消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程 可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。

函数:


1.创建新消息队列或取得已存在消息队列

原型:int msgget(key_t key, int msgflg);

参数:

     key:可以认为是一个端口号,也可以由函数ftok生成。

     msgflg:IPC_CREAT值,若没有该队列,则创建一个并返回新标识符;若已存在,则返回原标识符。
                  IPC_EXCL值,若没有该队列,则返回-1;若已存在,则返回0。

2.向队列读/写消息

原型:ssize_t  msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
         int         msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数:

     msqid:消息队列的标识码

     msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:  


  1. struct  msgstru   
  2. long  mtype;  /* 消息类型,必须 > 0 */    
  3.   char  mtext[1];  /* 消息文本 */    
  4. };  

     msgsz:消息的大小。

     msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。msgflg:用来指明核心程序在队列没有数据的情况 下所应采取的行动。如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会 立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG。当msgflg为0 时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式。

3.设置消息队列属性

原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );

参数:msgctl 系统调用对 msgqid 标识的消息队列执行 cmd 操作,系统定义了 3 种 cmd 操作: IPC_STAT , IPC_SET , IPC_RMID
      IPC_STAT : 该命令用来获取消息队列对应的 msqid_ds 数据结构,并将其保存到 buf 指定的地址空间。
      IPC_SET : 该命令用来设置消息队列的属性,要设置的属性存储在buf中。     

      IPC_RMID : 从内核中删除 msqid 标识的消息队列。

实例:

  1. /*receive.c */   
  2. #include <stdio.h>   
  3. #include <sys/types.h>   
  4. #include <sys/ipc.h>   
  5. #include <sys/msg.h>   
  6. #include <errno.h>   
  7.   
  8.   
  9. #define MSGKEY 1024   
  10.   
  11. struct  msgstru  
  12. {  
  13.    long  msgtype;  
  14.    char  msgtext[2048];  
  15. };  
  16.   
  17. /*子进程,监听消息队列*/   
  18. void  childproc(){  
  19.   struct  msgstru msgs;  
  20.   int  msgid,ret_value;  
  21.   char  str[512];  
  22.     
  23.   while (1){  
  24.      msgid = msgget(MSGKEY,IPC_EXCL );/*检查消息队列是否存在 */   
  25.      if (msgid < 0){  
  26.         printf("msq not existed! errno=%d [%s]\n" ,errno,strerror(errno));  
  27.         sleep(5);  
  28.         continue ;  
  29.      }  
  30.      /*接收消息队列*/   
  31.      ret_value = msgrcv(msgid,&msgs,sizeof ( struct  msgstru),0,0);  
  32.      printf("text=[%s] pid=[%d]\n" ,msgs.msgtext,getpid());  
  33.   }  
  34.   return ;  
  35. }  
  36.   
  37. void  main()  
  38. {  
  39.   int  i,cpid;  
  40.   
  41.   /* create 5 child process */   
  42.   for  (i=0;i<5;i++){  
  43.      cpid = fork();  
  44.      if  (cpid < 0)  
  45.     printf("fork failed\n" );  
  46.      else   if  (cpid ==0)  /*child process*/   
  47.         childproc();  
  48.   }  
  49. }  
  50.     
  1. /*send.c*/   
  2. #include <stdio.h>   
  3. #include <sys/types.h>   
  4. #include <sys/ipc.h>   
  5. #include <sys/msg.h>   
  6. #include <errno.h>   
  7.   
  8.   
  9. #define MSGKEY 1024   
  10.   
  11. struct  msgstru  
  12. {  
  13.    long  msgtype;  
  14.    char  msgtext[2048];   
  15. };  
  16.   
  17. main()  
  18. {  
  19.   struct  msgstru msgs;  
  20.   int  msg_type;  
  21.   char  str[256];  
  22.   int  ret_value;  
  23.   int  msqid;  
  24.   
  25.   msqid=msgget(MSGKEY,IPC_EXCL );  /*检查消息队列是否存在*/   
  26.   if (msqid < 0){  
  27.     msqid = msgget(MSGKEY,IPC_CREAT|0666);/*创建消息队列*/   
  28.     if (msqid <0){  
  29.     printf("failed to create msq | errno=%d [%s]\n" ,errno,strerror(errno));  
  30.     exit(-1);  
  31.     }  
  32.   }   
  33.    
  34.   while  (1){  
  35.     printf("input message type[0=end process]:" );  
  36.     scanf("%d" ,&msg_type);  
  37.     if  (msg_type == 0)  
  38.        break ;  
  39.     printf("input message to be sent:" );  
  40.     scanf ("%s" ,str);  
  41.     msgs.msgtype = msg_type;  
  42.     strcpy(msgs.msgtext, str);  
  43.     /* 发送消息队列 */   
  44.     ret_value = msgsnd(msqid,&msgs,sizeof ( struct  msgstru),IPC_NOWAIT);  
  45.     if  ( ret_value < 0 ) {  
  46.        printf("msgsnd() write msg failed,errno=%d[%s]\n" ,errno,strerror(errno));  
  47.        exit(-1);  
  48.     }  
  49.   }  
  50.   msgctl(msqid,IPC_RMID,0); //删除消息队列   

分享到:
评论

相关推荐

    Linux消息队列分析及应用

    ### Linux消息队列分析及应用 #### 一、消息队列基本概念 消息队列(Message Queue)作为Unix系统V版本中的三种进程间通信(Inter-Process Communication, IPC)机制之一,其他两种分别是信号量(Semaphores)和...

    linux 一个简单队列实例

    在这个“Linux一个简单队列实例”中,我们将探讨如何在Linux环境下实现一个基础的队列,并涵盖入队(enqueue)和出队(dequeue)这两个基本操作。 一、队列数据结构基础 队列的基本结构通常包括头部(front)和尾部...

    msg.rar_linux 消息队列_linux msgrcv_msg_消息队列

    综上所述,"msg.rar_linux 消息队列_linux msgrcv_msg_消息队列"的压缩包提供了学习和实践Linux消息队列通信机制的实例代码,通过对msgsnd.c和msgrcv.c的分析和运行,读者可以深入理解消息队列的工作原理和使用方法...

    Linux进程间通信-消息队列实例.pdf

    【Linux进程间通信-消息队列实例】 在操作系统中,进程间通信(Inter-Process Communication, IPC)是多个进程共享数据、协调工作的重要机制。在Linux系统中,提供了多种进程间通信方式,如管道、信号量、共享内存...

    Linux消息队列实现进程间通信实例详解

    ### Linux消息队列实现进程间通信实例详解 #### 一、消息队列概念与特性 消息队列是一种用于实现进程间通信(IPC)的技术手段,它允许一个进程将消息发送到另一个进程中。与命名管道类似,消息队列也能够解决进程...

    Linux下的消息队列测试程序,helloworld MessageTest

    这样的代码实例对于理解消息队列的使用方法和它在多进程协同工作中的作用非常有帮助。 总之,消息队列是Linux中一种强大的进程间通信工具,它提供了有序、异步的数据交换,同时具备存储和检索功能。通过学习和实践...

    linux下进程间通信--消息队列

    标题"Linux下进程间通信--消息队列"指出了我们讨论的核心——如何在Linux环境中利用消息队列进行进程间的通信。下面我们将深入探讨消息队列的概念、工作原理、使用方法以及提供的优点。 1. **消息队列概念**: ...

    linux消息队列.pdf

    1. 使用malloc为消息队列分配内存,创建MSGQUEUE实例_msg_queue。 2. 初始化_msg_queue中的互斥锁pthread_mutex_init和信号量sem_init。 3. 为消息数组分配内存,_msg_queue-&gt;msg = malloc(sizeof(MSG) * nr_msg),...

    p11.3.rar_LINUX消息队列_msgctl

    在Linux操作系统中,消息队列是一种非常重要的进程间通信(IPC, Inter-Process Communication)机制。消息队列允许进程之间交换结构化数据,不同于管道和socket等通信方式,它允许数据独立于发送和接收进程的执行...

    进程与消息队列例子简单容易

    根据给定的信息,我们可以分析并总结出关于进程与消息队列的相关知识点: ### 进程与消息队列的基础概念 1. **进程**:在计算机系统中,进程是正在运行的程序实例。每个进程都有一个独立的地址空间,并且可以执行...

    消息队列在Linux线程或进程间通信中的应用.pdf

    在给出的实例中,主模块、ABC通信模块、中心通信模块和日志模块都通过各自的消息队列进行通信,每个模块的消息类型由特定的命令字表示,便于识别和处理。 除了消息队列,其他常见的进程间通信(IPC)机制还包括: 1...

    linux_IPC.rar_linux 消息队列_linux 管道

    linux 的进程通信的3种方式 共享内存 消息队列 管道方式实现的实例。有注释!

    消息队列的简单示范

    通过这些实例,你可以学习如何使用C语言或其他编程语言与这些消息队列接口交互。 学习消息队列的关键在于理解它的核心概念,如队列、消息、生产者、消费者、以及它们之间的交互方式。同时,了解如何在代码中正确地...

    Liunx嵌入式系统进程间通信实例(二)—消息队列

    本文将深入探讨一种常见的IPC形式——消息队列,并通过一个具体的实例来阐述其工作原理和使用方法。 消息队列是Linux内核提供的一种同步机制,允许进程之间传递结构化数据。每个消息队列都有一个唯一的标识符(key...

    消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例

    在学习消息队列时,实例代码是至关重要的,它可以帮助理解如何使用这些函数。例如,你可以创建一个简单的程序,其中一个进程发送消息到队列,另一个进程接收并处理这些消息。通过调整消息类型和标志,你可以探索各种...

    RabbitMQ实战:高效部署分布式消息队列 pdf版

    **RabbitMQ实战:高效部署分布式消息队列** 在当今的软件开发中,消息队列作为异步处理和系统解耦的重要工具,被广泛应用。RabbitMQ作为一个开源的消息代理和队列服务器,以其稳定性和易用性赢得了广大开发者的好评...

    进程间通信:消息队列示例代码

    总结来说,消息队列在Linux系统编程中扮演着重要角色,它提供了有序、可靠的数据传递手段,适用于需要长时间保存消息或者希望消息按顺序处理的场景。通过学习和理解消息队列的工作原理以及示例代码,开发者可以更好...

    linux 程序开发实例

    学习这一部分,你需要理解进程的创建(fork)、进程间通信(IPC,如管道、消息队列、共享内存)以及进程状态的管理(如等待、唤醒、信号处理)。`fork()`函数用于创建新的进程,而`exec()`系列函数用于加载新的程序...

    linux下oracle创建实例总结

    ### Linux 下 Oracle 10.2.0 创建实例详尽指南 #### 一、环境配置与准备 在开始创建 Oracle 数据库实例之前,确保已经安装了 Oracle 10.2.0 版本,并完成了相应的环境变量配置。下面将详细介绍环境配置的步骤。 *...

    linux 网络通信实例

    本实例旨在教你如何构建服务器端和客户端程序,实现这两种协议的通信。 TCP是一种面向连接的、可靠的传输协议,它提供全双工通信,确保数据的顺序传输和错误校验。在TCP通信中,首先需要建立连接(三次握手),然后...

Global site tag (gtag.js) - Google Analytics