`
microjava
  • 浏览: 318657 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

c语言编程之消息队列

阅读更多
//msg.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

#define    MSGKEY	1000

struct msgStru
{
    long    msgType;
    char    msgText[4096];
};

main()
{
   int   iMsgId;
   struct msgStru slQMsg,slRcvMsg;
   int   ilRc;

   iMsgId = msgget(MSGKEY,IPC_EXCL);/*检查消息队列是否存在*/
   if ( iMsgId < 0 ){
       iMsgId = msgget(MSGKEY,IPC_CREAT|0666);/*创建消息队列*/
       if ( iMsgId < 0 ){
           printf("create msgQ error! errno=%d[%s]\n",errno,strerror(errno));
           exit(-1);
       }
   }

   slQMsg.msgType = 100;
   strcpy(slQMsg.msgText,"Hello mcfeng.");
   ilRc = msgsnd(iMsgId, &slQMsg, sizeof(struct msgStru),IPC_NOWAIT);
   if( ilRc < 0 ) {
       printf("msgsnd()写消息队列失败,errno=%d[%s]\n",errno,strerror(errno));
       exit(-1);
   }
   
   ilRc = msgrcv(iMsgId,&slRcvMsg,sizeof(struct msgStru),0,0);/*接收消息队列*/
   printf("text=[%s]\n",slRcvMsg.msgText);

   msgctl(iMsgId,IPC_RMID,0);  /* 删除消息队列 */
   exit(0);
}



//receive.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>


#define MSGKEY 1024

struct msgstru
{
   long msgtype;
   char msgtext[2048];

};

main()
{
  int imsgID;
  struct msgstru slQMsg,slRcvMsg;
  int ilrc;
  char str[1024];


  imsgID=msgget(MSGKEY,IPC_EXCL );//检查消息队列是否存在
  if(imsgID < 0){
        printf("消息不存在! errno=%d [%s]\n",errno,strerror(errno));
        exit(-1);
    }

   ilrc = msgrcv(imsgID,&slRcvMsg,sizeof(struct msgstru),0,0);/*接收消息队列*/
   printf("text=[%s]\n",slRcvMsg.msgtext);

   msgctl(imsgID,IPC_RMID,0); //删除消息队列
   exit(0);
}



//send.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>


#define MSGKEY 1024

struct msgstru
{
   long msgtype;
   char msgtext[2048]; 

};

main()
{
  int imsgID;
  struct msgstru slQMsg,slRcvMsg;
  int ilrc;
  char str[2048];

  printf("请输入字符串:");
  scanf ("%s",str);

  imsgID=msgget(MSGKEY,IPC_EXCL );  //检查消息队列是否存在
  if(imsgID < 0){
    imsgID=msgget(MSGKEY,IPC_CREAT|0666);//创建消息队列
    if(imsgID <0 ){
	printf("创建消息失败! errno=%d [%s]\n",errno,strerror(errno));
	exit(-1);
    }
  }  

  slQMsg.msgtype = 100;
  strcpy(slQMsg.msgtext, str);
  ilrc = msgsnd(imsgID,&slQMsg,sizeof(struct msgstru),IPC_NOWAIT); //发送消息队列
  if ( ilrc < 0 ) {
       printf("msgsnd()写消息队列失败,errno=%d[%s]\n",errno,strerror(errno));
       exit(-1);

  }
  exit(0);

}



本程序实例介绍linux环境下利用消息队列进行进程间通信,主要介绍ftok函数,msgget创建消息队列和获取已存在消息队列,
msgctl获取消息队列结构信息,msgsnd发送消息到消息队列,msgrcv从消息队列中获取消息。

本程序由两个.c文件组成,msgQueueRecv.c和msgQueueSend.c,msgQueueRecv.c里面创建消息队列并阻塞式从消息队列接收消息,
最后删除消息队列(消息队列在内核创建);msgQueueSend.c获取以创建的消息队列,向消息队列发送消息。

请参考《unix环境高级编程》辅助学习。

//msgQueueRecv.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define BUFF_LEN 1024
#define RET_ERROR 1
#define RET_OK 0

int main()
{
    char *pcPathName = "/";       	/* pathname for ftok */
    int iProjectId = 5; 		/* id for ftok */
    key_t kId; 				/* key id */
    struct msqid_ds stMsgInfo; 		/* msg queue info structure */
    struct msgRecvStructure
    {
        long lMsgType; 			/* msg type */
        char acMsgRecvBuff[BUFF_LEN]; 	/* send msg buffer */
    }stMsgRecv;
    int iRet;
    int iMsgId; 			/* msg queue id */
    int iFlag = IPC_CREAT | IPC_EXCL | 0666; 	/* msg queue creating flag */
    
    /* build key using ftok function */
    kId = ftok(pcPathName, iProjectId);
    if ( kId == -1 )
    {
        printf("building key error, ftok() error!\n");
        return RET_ERROR;
    }
    /* create msg queue */
    iMsgId = msgget(kId, iFlag);
    if ( iMsgId == -1 )
    {
        printf("create msg queue error, msgget() error!\n");
        return RET_ERROR;
    }

    /* recv msg from msg queue */
    iRet = msgrcv(iMsgId, &stMsgRecv, BUFF_LEN, 1, 0);
    if ( iRet == -1 )
    {
        printf("msg recv error, msgrcv() error!\n");
        msgctl(iMsgId, IPC_RMID, &stMsgInfo); 	/* delete msg queue from kernel */
        return RET_ERROR;
    }
    else
    {
        printf("msg recv content: %s\n", stMsgRecv.acMsgRecvBuff);
    }

    msgctl(iMsgId, IPC_RMID, &stMsgInfo); 	/* delete msg queue from kernel */
    
    return RET_OK;
}



msgQueueSend.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define BUFF_LEN 1024
#define RET_ERROR 1
#define RET_OK 0

int main()
{
    char *pcPathName = "/"; 	/* pathname for ftok */
    int iProjectId = 5; 	/* id for ftok */
    key_t kId; 			/* key id */
    struct msqid_ds stMsgInfo; 	/* msg queue info structure */
    struct msgSendStructure
    {
        long lMsgType; 			/* msg type */
        char acMsgSendBuff[BUFF_LEN]; 	/* send msg buffer */
    }stMsgSend;
    int iRet;
    int iMsgId; 			/* msg queue id */
    int iFlag = 0666; 			/* msg queue creating flag */
    
    /* build key using ftok function */
    kId = ftok(pcPathName, iProjectId);
    if ( kId == -1 )
    {
        printf("building key error, ftok() error!\n");
        return RET_ERROR;
    }
    /* get existing msg queue */
    iMsgId = msgget(kId, iFlag);
    if ( iMsgId == -1 )
    {
        printf("get msg queue error, msgget() error!\n");
        return RET_ERROR;
    }

    /* send msg to msg queue */
    stMsgSend.lMsgType = 1;
    strcpy(stMsgSend.acMsgSendBuff, "hello,world");
    iRet = msgsnd(iMsgId, &stMsgSend, strlen("hello,world")+1, IPC_NOWAIT);
    if ( iRet == -1 )
    {
        printf("msg send error, msgsnd() error!\n");
        return RET_ERROR;
    }
    
    return RET_OK;
}
分享到:
评论

相关推荐

    C语言实现栈与队列

    在IT领域,数据结构是编程基础中的重要组成部分,而栈(Stack)和队列(Queue)是最基础且广泛使用的两种数据结构。本项目是用C语言实现的栈和队列,提供了可加载和使用的源代码,这对于理解这两种数据结构的工作...

    C语言实现多级反馈队列调度算法

    通过这个C语言实现,你不仅可以加深对多级反馈队列调度算法的理解,还可以提高编程和系统分析能力。这种调度策略的灵活性使得它能够适应各种不同的工作负载,为现代操作系统提供了高效的任务调度机制。

    linux下C语言编程(进程通信、消息队列)

    本文将着重讨论Linux下C语言编程中的进程通信以及消息队列的使用。 首先,进程通信在Linux下可以通过多种机制实现,包括但不限于无名管道、命名管道、信号、消息队列、共享内存、信号量等。这些机制各有其特点和...

    windows下面c语言实现的队列

    总结来说,Windows下的C语言编程涉及线程调度、消息队列和信号量等关键概念,这些都是构建并发和多线程应用程序的基础。通过理解和应用这些知识,开发者可以创建高效运行、正确同步的程序,充分利用多核处理器的优势...

    (c语言)使用循环队列方式判断括号匹配

    本文将深入探讨如何使用C语言和数据结构中的循环队列来实现括号匹配的算法。 首先,我们需要了解什么是循环队列。循环队列是一种线性数据结构,它利用数组的“首尾相接”特性,模拟一个无限的队列。当队列的末尾被...

    数据结构 严蔚敏 C语言版 循环队列

    这本书中,循环队列作为重要的数据结构之一,被详细地探讨和阐述。 循环队列是一种线性数据结构,它通过将队列的首尾相连形成一个闭合的环状结构,从而解决了普通队列在满或空时需要特殊处理的问题。在循环队列中,...

    基于C语言的数据结构队列模板

    总结来说,"基于C语言的数据结构队列模板"是一个涵盖了数据结构、动态内存管理、泛型编程等多个关键IT知识点的实用资源。对于想要深入理解和应用数据结构的C语言开发者来说,这是一个宝贵的参考资料。

    数据结构C语言版栈和队列的应用编程

    "数据结构C语言版栈和队列的应用编程" 数据结构是计算机科学中的一门重要课程,它研究的是计算机存储、表示和处理数据的方法和技术。栈和队列是数据结构中两种基本的数据类型,它们广泛应用于计算机科学和信息技术...

    c语言精彩编程200例

    《C语言精彩编程200例》是一本旨在帮助初学者和有一定基础的开发者深入了解C语言编程技巧的资源集合。这个压缩包包含了丰富的实例代码,旨在通过实践来增强读者的编程能力,尤其对于数据结构的理解和应用有显著的...

    多级反馈队列调度C语言

    多级反馈队列调度C语言设计进程控制块PCB表结构,适用于多级反馈队列调度算法。PCB结构通常包括以下信息:进程名,进程优先数,轮转时间片,进程已占用的CPU时间,进程还需要的CPU时间,进程的状态,当前队列指针等...

    C语言深度(C语言编程)

    6. **错误处理**:C语言编程中,错误处理是不可或缺的一部分,如使用errno和perror来处理运行时错误,或者通过返回值检测函数执行状态。 7. **位运算**:C语言支持位级操作,这对于低级别的硬件控制和优化代码性能...

    duilie.rar_ duilie_C语言 队列_C语言队列_duilie_循环队列

    总结来说,这个压缩包提供了一个学习C语言实现链队列和循环队列的宝贵资源,对想要提升C语言编程技能,尤其是数据结构和算法理解的开发者来说非常有价值。通过实践这些示例,可以更好地掌握队列这一基本数据结构及其...

    《实用C语言编程(第三版)》.pdf

    但是,我可以针对标题和描述中提到的《实用C语言编程(第三版)》来详细说明一些重要的C语言知识点。 C语言是一种广泛使用的通用高级编程语言,最初由贝尔实验室的Dennis Ritchie在1972年开发,作为重新实现Unix...

    C语言用消息队列实现银行ATM.zip

    在C语言编程中,消息队列是一种用于进程间通信(IPC, Inter-Process Communication)的有效机制,常用于实现多进程间的同步与数据交换。在这个"银行ATM"项目中,我们可能涉及到以下C语言和消息队列的知识点: 1. **...

    多级反馈队列调度算法 C语言模拟实现

    根据提供的标题、描述、标签及部分代码内容,我们可以总结出以下关于“多级反馈队列调度算法 ...本C语言实现中,通过自定义的数据结构和关键函数实现了算法的核心逻辑,展示了如何在实际编程中应用这一复杂的调度策略。

    Linux下C语言编程教程

    ### Linux下C语言编程教程知识点概览 #### 第一章 基础知识 - **源程序编译**: 在Linux环境中使用GCC(GNU Compiler Collection)编译器进行C语言源程序的编译工作。GCC是一个功能强大的编译器,支持多种编程语言。...

    Linux下C语言编程(聊天室)

    在Linux环境下进行C语言编程,可以创建出功能丰富的应用程序,比如聊天室。这个项目涉及到的知识点广泛,包括网络编程、进程通信以及文件操作等。以下将详细解释这些关键概念。 首先,`server.c`和`client.c`是聊天...

    精通UNIX下C语言编程与项目实践

    5. **进程和线程**:理解进程的生命周期、进程间通信(IPC)方法,如管道、信号量、消息队列、共享内存,以及线程的创建和同步,如`pthread_create()`、`pthread_join()`、`mutex`和`condition_variable`。...

    C语言编程题超级大合集

    C语言编程题超级大合集是一份集合了各种难度级别的C语言编程问题的资源,旨在帮助初学者和经验丰富的程序员巩固和提升C语言编程技能。这份合集的重要性在于,它涵盖了从基础语法到高级概念的各种题目,对于准备面试...

Global site tag (gtag.js) - Google Analytics