- 浏览: 104432 次
- 性别:
- 来自: 上海
最新评论
-
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 2116Discuz插件编写教程: 1, ... -
Android
2012-12-25 13:48 9151. 请描述下 Activity ... -
c++ socket 消息构建
2012-10-10 11:14 913客户端 : /* client.c 向 ... -
Makefile上手教程(转载)
2012-09-25 10:46 1087译者自述: 最开始接触开源软件时,觉得make很神秘,打 ... -
Linux 信号signal处理机制
2012-09-24 15:55 844信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的 ... -
C++ TinyXml操作(含源码下载)
2012-09-24 15:18 974前言 TinyXML是一个 ... -
linux下C与C++混合编程
2012-09-21 10:36 1703首先,混合编程不是指在同一个文件里写C与C++。 比如说想 ... -
Linux 下编译C程序
2012-09-20 11:58 3153GCC 已不再是主要针对GNU项目自身的软件的小型 C ... -
VS2010快捷键
2012-09-10 15:30 790VS2010快捷键 有人发了VS2 ... -
mysql 备份
2011-06-10 16:15 4201,直接将MySQL数据库压缩备份,不能在mysql模式下使用 ... -
Apache 虚拟机简单配置
2011-03-24 11:57 4879Apache 虚拟机简单配置 配置虚拟机主要是基于主机 ... -
svn的使用
2011-03-17 16:10 10421,svn中有几个重要的概念:branche,tag,trun ... -
社交网页游戏解析之产品篇
2010-06-03 15:20 995转载 ... -
常见手机参数含义
2010-05-18 14:45 10821,屏幕大小:如3.5英寸,它是指手机屏幕对角线的长度。 ... -
Memcache的使用和协议分析详解
2009-08-13 15:44 869作者:heiy ... -
CS vs BS
2009-08-07 09:12 1704C/S又称Client/Serv ... -
优秀网站源码、编程源码下载网站大集中
2009-08-06 17:41 944优秀网站源码、编程源码下载网站大集中 1.51源码:ht ...
相关推荐
linux系统下实现一个简单的队列实例 此实例仅仅只实现了基本的出队 入队
主要介绍了Linux消息队列实现进程间通信实例详解的相关资料,需要的朋友可以参考下
Linux进程间通信-消息队列实例.pdf 学习资料 复习资料 教学资源
非常齐全的消息队列应用实例,每个工程都经过调试并且通过
linux 的进程通信的3种方式 共享内存 消息队列 管道方式实现的实例。有注释!
进程与消息队列进程与消息队列进程与消息队列进程与消息队列进程与消息队列进程与消息队列进程与消息队列进程与消息队列进程与消息队列
linux 下的消息队列详解,实例为聊天实现
linux c 多进程间的实例,通信使用共享内存和消息队列
该消息队列用于linux下,进程通信 #根据路径和后缀创建一个id $key = ftok(__DIR__, 'R'); #获取队列中的消息 $q = msg_get_queue($key); #删除队列 msg_remove_queue($q); #获取队列的状态信息 $status = msg_stat...
很多博客都有深入分析内核队列的工作原理,但是少有能够拿来直接运行的demo,这个demo亲测可用!
主要介绍了实现posix消息队列示例,学习记录锁,线程互斥量,线程条件变量,内存映射,信号,线程的综合应用,需要的朋友可以参考下
linux 内核ipc共享资源 程序实例 linux 内核ipc共享资源 程序实例 linux 内核ipc共享资源 程序实例 linux 内核ipc共享资源 程序实例
10.3.4 消息队列 309 10.4 arm linux线程相关api 312 10.5 linux守护进程 317 10.5.1 守护进程概述 317 10.5.2 编写规则 318 10.5.3 守护进程实例 319 本章小结 321 动手练练 321 第11章 arm...
4.本实例建造了一个服务器消息发送线程,供服务器发送信息给客户端。 5.本实例建造了一个基本的队列,供存放,提取信息使用。 本DEMO麻雀虽小却五脏俱全,演示了linux服务器建造需要的基本元素。linux服务器架构都...
在Linux上多实例部署,实例个数等于处理器个数,各实例最大内存直接为本机物理内存,避免单个实例内存撑爆 把海量数据(10亿+)根据key哈希(Crc16/Crc32)存放在多个实例上,读写性能成倍增长 采用二进制序列化,而...
经典的linux按键驱动实例,使用异步机制与工作队列,最好用的
8.6.2 消息队列的应用 8.7 实验内容 8.7.1 管道通信实验 8.7.2 共享内存实验 8.8 本章小结 8.9 思考与练习 第9章 多线程编程 9.1 Linux线程概述 9.1.1 线程概述 9.1.2 线程机制的分类和特性 9.2 Linux线程编程 ...
本书通过55个精彩的实例,全面剖析了在Linux下编写网络应用程序的方法,并阐述了网络协议架构和开发规范。为了适应不同读者的需要,本书从最基本的Linux系统操作到网络技术的基本理念,逐步深入至Linux/UNIX下具体的...
入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不...