- 浏览: 106681 次
- 性别:
- 来自: 上海
最新评论
-
marx:
marx 写道make: *** No targets spe ...
php 性能分析工具xhprof使用手册 -
marx:
make: *** No targets specified ...
php 性能分析工具xhprof使用手册
前言:
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程 可以向其中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。
函数:
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:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下:
- struct msgstru
- { long mtype; /* 消息类型,必须 > 0 */
- char mtext[1]; /* 消息文本 */
- };
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 标识的消息队列。
实例:
- /*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];
- };
- /*子进程,监听消息队列*/
- void childproc(){
- struct msgstru msgs;
- int msgid,ret_value;
- char str[512];
- while (1){
- msgid = msgget(MSGKEY,IPC_EXCL );/*检查消息队列是否存在 */
- if (msgid < 0){
- printf("msq not existed! errno=%d [%s]\n" ,errno,strerror(errno));
- sleep(5);
- continue ;
- }
- /*接收消息队列*/
- ret_value = msgrcv(msgid,&msgs,sizeof ( struct msgstru),0,0);
- printf("text=[%s] pid=[%d]\n" ,msgs.msgtext,getpid());
- }
- return ;
- }
- void main()
- {
- int i,cpid;
- /* create 5 child process */
- for (i=0;i<5;i++){
- cpid = fork();
- if (cpid < 0)
- printf("fork failed\n" );
- else if (cpid ==0) /*child process*/
- childproc();
- }
- }
- /*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()
- {
- struct msgstru msgs;
- int msg_type;
- char str[256];
- int ret_value;
- int msqid;
- msqid=msgget(MSGKEY,IPC_EXCL ); /*检查消息队列是否存在*/
- if (msqid < 0){
- msqid = msgget(MSGKEY,IPC_CREAT|0666);/*创建消息队列*/
- if (msqid <0){
- printf("failed to create msq | errno=%d [%s]\n" ,errno,strerror(errno));
- exit(-1);
- }
- }
- while (1){
- printf("input message type[0=end process]:" );
- scanf("%d" ,&msg_type);
- if (msg_type == 0)
- break ;
- printf("input message to be sent:" );
- scanf ("%s" ,str);
- msgs.msgtype = msg_type;
- strcpy(msgs.msgtext, str);
- /* 发送消息队列 */
- ret_value = msgsnd(msqid,&msgs,sizeof ( struct msgstru),IPC_NOWAIT);
- if ( ret_value < 0 ) {
- printf("msgsnd() write msg failed,errno=%d[%s]\n" ,errno,strerror(errno));
- exit(-1);
- }
- }
- msgctl(msqid,IPC_RMID,0); //删除消息队列
-
}
发表评论
-
Discuz插件编写教程
2013-10-21 15:23 2156Discuz插件编写教程: 1, ... -
Android
2012-12-25 13:48 9511. 请描述下 Activity ... -
c++ socket 消息构建
2012-10-10 11:14 954客户端 : /* client.c 向 ... -
Makefile上手教程(转载)
2012-09-25 10:46 1179译者自述: 最开始接触开源软件时,觉得make很神秘,打 ... -
Linux 信号signal处理机制
2012-09-24 15:55 924信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的 ... -
C++ TinyXml操作(含源码下载)
2012-09-24 15:18 1021前言 TinyXML是一个 ... -
linux下C与C++混合编程
2012-09-21 10:36 1741首先,混合编程不是指在同一个文件里写C与C++。 比如说想 ... -
Linux 下编译C程序
2012-09-20 11:58 3174GCC 已不再是主要针对GNU项目自身的软件的小型 C ... -
VS2010快捷键
2012-09-10 15:30 821VS2010快捷键 有人发了VS2 ... -
mysql 备份
2011-06-10 16:15 4701,直接将MySQL数据库压缩备份,不能在mysql模式下使用 ... -
Apache 虚拟机简单配置
2011-03-24 11:57 4909Apache 虚拟机简单配置 配置虚拟机主要是基于主机 ... -
svn的使用
2011-03-17 16:10 10701,svn中有几个重要的概念:branche,tag,trun ... -
社交网页游戏解析之产品篇
2010-06-03 15:20 1020转载 ... -
常见手机参数含义
2010-05-18 14:45 11191,屏幕大小:如3.5英寸,它是指手机屏幕对角线的长度。 ... -
Memcache的使用和协议分析详解
2009-08-13 15:44 899作者:heiy ... -
CS vs BS
2009-08-07 09:12 1730C/S又称Client/Serv ... -
优秀网站源码、编程源码下载网站大集中
2009-08-06 17:41 975优秀网站源码、编程源码下载网站大集中 1.51源码:ht ...
相关推荐
### Linux消息队列分析及应用 #### 一、消息队列基本概念 消息队列(Message Queue)作为Unix系统V版本中的三种进程间通信(Inter-Process Communication, IPC)机制之一,其他两种分别是信号量(Semaphores)和...
在这个“Linux一个简单队列实例”中,我们将探讨如何在Linux环境下实现一个基础的队列,并涵盖入队(enqueue)和出队(dequeue)这两个基本操作。 一、队列数据结构基础 队列的基本结构通常包括头部(front)和尾部...
综上所述,"msg.rar_linux 消息队列_linux msgrcv_msg_消息队列"的压缩包提供了学习和实践Linux消息队列通信机制的实例代码,通过对msgsnd.c和msgrcv.c的分析和运行,读者可以深入理解消息队列的工作原理和使用方法...
【Linux进程间通信-消息队列实例】 在操作系统中,进程间通信(Inter-Process Communication, IPC)是多个进程共享数据、协调工作的重要机制。在Linux系统中,提供了多种进程间通信方式,如管道、信号量、共享内存...
### Linux消息队列实现进程间通信实例详解 #### 一、消息队列概念与特性 消息队列是一种用于实现进程间通信(IPC)的技术手段,它允许一个进程将消息发送到另一个进程中。与命名管道类似,消息队列也能够解决进程...
这样的代码实例对于理解消息队列的使用方法和它在多进程协同工作中的作用非常有帮助。 总之,消息队列是Linux中一种强大的进程间通信工具,它提供了有序、异步的数据交换,同时具备存储和检索功能。通过学习和实践...
标题"Linux下进程间通信--消息队列"指出了我们讨论的核心——如何在Linux环境中利用消息队列进行进程间的通信。下面我们将深入探讨消息队列的概念、工作原理、使用方法以及提供的优点。 1. **消息队列概念**: ...
1. 使用malloc为消息队列分配内存,创建MSGQUEUE实例_msg_queue。 2. 初始化_msg_queue中的互斥锁pthread_mutex_init和信号量sem_init。 3. 为消息数组分配内存,_msg_queue->msg = malloc(sizeof(MSG) * nr_msg),...
在Linux操作系统中,消息队列是一种非常重要的进程间通信(IPC, Inter-Process Communication)机制。消息队列允许进程之间交换结构化数据,不同于管道和socket等通信方式,它允许数据独立于发送和接收进程的执行...
根据给定的信息,我们可以分析并总结出关于进程与消息队列的相关知识点: ### 进程与消息队列的基础概念 1. **进程**:在计算机系统中,进程是正在运行的程序实例。每个进程都有一个独立的地址空间,并且可以执行...
在给出的实例中,主模块、ABC通信模块、中心通信模块和日志模块都通过各自的消息队列进行通信,每个模块的消息类型由特定的命令字表示,便于识别和处理。 除了消息队列,其他常见的进程间通信(IPC)机制还包括: 1...
linux 的进程通信的3种方式 共享内存 消息队列 管道方式实现的实例。有注释!
通过这些实例,你可以学习如何使用C语言或其他编程语言与这些消息队列接口交互。 学习消息队列的关键在于理解它的核心概念,如队列、消息、生产者、消费者、以及它们之间的交互方式。同时,了解如何在代码中正确地...
本文将深入探讨一种常见的IPC形式——消息队列,并通过一个具体的实例来阐述其工作原理和使用方法。 消息队列是Linux内核提供的一种同步机制,允许进程之间传递结构化数据。每个消息队列都有一个唯一的标识符(key...
在学习消息队列时,实例代码是至关重要的,它可以帮助理解如何使用这些函数。例如,你可以创建一个简单的程序,其中一个进程发送消息到队列,另一个进程接收并处理这些消息。通过调整消息类型和标志,你可以探索各种...
**RabbitMQ实战:高效部署分布式消息队列** 在当今的软件开发中,消息队列作为异步处理和系统解耦的重要工具,被广泛应用。RabbitMQ作为一个开源的消息代理和队列服务器,以其稳定性和易用性赢得了广大开发者的好评...
总结来说,消息队列在Linux系统编程中扮演着重要角色,它提供了有序、可靠的数据传递手段,适用于需要长时间保存消息或者希望消息按顺序处理的场景。通过学习和理解消息队列的工作原理以及示例代码,开发者可以更好...
学习这一部分,你需要理解进程的创建(fork)、进程间通信(IPC,如管道、消息队列、共享内存)以及进程状态的管理(如等待、唤醒、信号处理)。`fork()`函数用于创建新的进程,而`exec()`系列函数用于加载新的程序...
### Linux 下 Oracle 10.2.0 创建实例详尽指南 #### 一、环境配置与准备 在开始创建 Oracle 数据库实例之前,确保已经安装了 Oracle 10.2.0 版本,并完成了相应的环境变量配置。下面将详细介绍环境配置的步骤。 *...
本实例旨在教你如何构建服务器端和客户端程序,实现这两种协议的通信。 TCP是一种面向连接的、可靠的传输协议,它提供全双工通信,确保数据的顺序传输和错误校验。在TCP通信中,首先需要建立连接(三次握手),然后...