- 浏览: 346289 次
文章分类
最新评论
-
亚当爱上java:
"给pre-commit添加可执行权限:chmod ...
svn强制要求提交注释--pre-commit钩子 -
rosasyou:
不知道这篇文章是怎么才让人看的?估计不是浏览器兼容问题。 ,与 ...
Zend Framework的DB处理 -
jinjiankang:
$youngest=`svnlook youngest $sv ...
svn备份策略 -
wangxc:
你好,我按照你介绍的方法在创建完weekly_backup.p ...
svn备份策略 -
yangfuchao418:
...
关于memcached的浅见
消息队列 (也叫做报文队列)是Unix系统V版本中3种进程间通信机制之一。另外两种是信号灯和共享内存。这些IPC机制使用共同的授权方法。只有通过系统调用将标志符传递给核心之后,进程才能存取这些资源。这种系统IPC对象使用的控制方法和文件系统非常类似。使用对象的引用标志符作为资源表中的索引。 消息队列就是一个消息的链表。就是把消息看作一个记录,并且这个记录具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读出消息。 Linux采用消息队列的方式来实现消息传递。这种消息的发送方式是:发送方不必等待接收方检查它所收到的消息就可以继续工作下去,而接收方如果没有收到消息也不需等待。这种通信机制相对简单,但是应用程序使用起来就需要使用相对复杂的方式来应付了。新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。 消息队列是随内核持续的并和进程相关,只有在内核重起或者显示删除一个消息队列时,该消息队列才会真正被删除。因此系统中记录消息队列的数据结构 (struct ipc_ids msg_ids)位于内核中,系统中的所有消息队列都可以在结构msg_ids中中找到访问入口。 IPC标识符:每一个I P C目标都有一个唯一的I P C标识符。这里所指的I P C目标是指一个单独的消息队列、一个信号量集或者一个共享的内存段。系统内核使用此标识符在系统内核中指明 I P C目标。 IPC 关键字:想要获得唯一的标识符,则必须使用一个 I P C关键字。客户端进程和服务器端进程必须双方都同意此关键字。这是建立一个客户机/服务器框架的第一步。在System V IPC机制中,建立两端联系的路由方法是和I P C关键字直接相关的。通过在应用程序中设置关键字值,每一次使用的关键字都可以是相同的。一般情况下,可以使用f t o k ( )函数为客户端和服务器端产生关键字值。 命令ipcs用于读取System V IPC目标的状态。 下面是ipcs命令输出的例子: [root@wanglong wanglong]# ipcs —— Shared Memory Segments ——– key shmid owner perms bytes nattch status 0×00000000 0 root 644 40 2 0×00000000 32769 root 644 16384 2 0×00000000 65538 root 644 268 2 —— Semaphore Arrays ——– key semid owner perms nsems 0×000000a7 0 root 600 1 0×00000000 98305 apache 600 1 0×00000000 65538 apache 600 1 0×00000000 131075 apache 600 1 0×00000000 163844 apache 600 1 0×00000000 196613 apache 600 1 0×00000000 229382 apache 600 1 0×00000000 262151 apache 600 1 0×00000000 294920 apache 600 1 —— Message Queues ——– key msqid owner perms used-bytes messages 内核中实现消息传递机制的代码基本上都在文件ipc/msg.c中,消息队列的主要调用有下面4个,这里只作简单介绍: (1)msgget:调用者提供一个消息队列的键标 (用于表示个消息队列的唯一名字),当这个消息队列存在的时候, 这个消息调用负责返回这个队列的标识号;如果这个队列不存在,就创建一个消息队列,然后返回这个消息队列的标识号 ,主要由sys_msgget执行。 (2)msgsnd:向一个消息队列发送一个消息,主要由sys_msgsnd执行。 (3)msgrcv:从一个消息队列中收到一个消息,主要由sys_msgrcv执行。 (4)msgctl:在消息队列上执行指定的操作。根据参数的不同和权限的不同,可以执行检索、删除等的操作,主要由sys_msgctl执行。 下面的例子很好的演示了创建、发送、读取、改变权限以及删除消息队列各种操作: #include <string.h> struct mymsgbuf { void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text); if(argc == 1) /* Create unique key via call to ftok() */ /* Open the queue - create if necessary */ { switch(tolower(argv[1][0])) default: usage(); } return(0); void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text) if((msgsnd(qid, (struct msgbuf *)qbuf, void read_message(int qid, struct mymsgbuf *qbuf, long type) printf(“Type: %ld Text: %sn”, qbuf->mtype, qbuf->mtext); void remove_queue(int qid) void change_queue_mode(int qid, char *mode) /* Get current info */ /* Convert and load the mode */ /* Update the mode */ void usage(void) 程序保存为 ipcs.c 编译:gcc -o ipcs ipcs.c 程序运行结果解释: [root@wanglong wanglong]# ./ipcs s 001 hello! Sending a message … [root@wanglong wanglong]# ./ipcs s 001 world! Sending a message … [root@wanglong wanglong]# ./ipcs s 001 you Sending a message … [root@wanglong wanglong]# ./ipcs s 001 and Sending a message … [root@wanglong wanglong]# ./ipcs s 001 me! Sending a message … [root@wanglong wanglong]# ./ipcs r 001 Reading a message … Type: 001 Text:hello! [root@wanglong wanglong]# ./ipcs r 001 Reading a message … Type: 001 Text:world! [root@wanglong wanglong]# ./ipcs r 001 Reading a message … Type: 001 Text:you [root@wanglong wanglong]# ./ipcs d 001 /*删除了消息队列001*/ [root@wanglong wanglong]# ./ipcs r 001 Reading a message .. ./* 因为删除了,所以读不出消息了*/
http://www.wanglong-neu.cn/?p=37
一、消息队列的基本概念
二、ipcs 命令
ipcs -q: 只显示消息队列。
ipcs -s: 只显示信号量。
ipcs -m: 只显示共享内存。
ipcs –help: 其他的参数。三、消息队列的主要调用
四、消息队列的应用例子
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_SEND_SIZE 80
long mtype;
char mtext[MAX_SEND_SIZE];
};
void read_message(int qid, struct mymsgbuf *qbuf, long type);
void remove_queue(int qid);
void change_queue_mode(int qid, char *mode);
void usage(void);
int main(int argc, char *argv[])
{
key_t key;
int msgqueue_id;
struct mymsgbuf qbuf;
usage();
key = ftok(“.”, ’m');
if((msgqueue_id = msgget(key, IPC_CREAT|0660)) == -1)
perror(“msgget”);
exit(1);
}
{
case ’s’: send_message(msgqueue_id, (struct mymsgbuf *)&qbuf,atol(argv[2]), argv[3]);
break;
case ’r': read_message(msgqueue_id, &qbuf, atol(argv[2]));
break;
case ’d': remove_queue(msgqueue_id);
break;
case ’m': change_queue_mode(msgqueue_id, argv[2]);
break;
}
{
/* Send a message to the queue */
printf(“Sending a message …n”);
qbuf->mtype = type;
strcpy(qbuf->mtext, text);
strlen(qbuf->mtext)+1, 0)) ==-1)
{
perror(“msgsnd”);
exit(1);
}
}
{
/* Read a message from the queue */
printf(“Reading a message …n”);
qbuf->mtype = type;
msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0);
}
{
/* Remove the queue */
msgctl(qid, IPC_RMID, 0);
}
{
struct msqid_ds myqueue_ds;
msgctl(qid, IPC_STAT, &myqueue_ds);
sscanf(mode, ”%ho”, &myqueue_ds.msg_perm.mode);
msgctl(qid, IPC_SET, &myqueue_ds);
}
{
fprintf(stderr, ”msgtool - A utility for tinkering with msg queuesn”);
fprintf(stderr, ”nUSAGE: msgtool (s)end n”);
fprintf(stderr, ” (r)ecv n”);
fprintf(stderr, ” (d)eleten”);
fprintf(stderr, ” (m)ode n”);
exit(1);
}
发表评论
-
图片压缩的一些心得
2010-11-03 11:45 2015http://blog.lizhigang.net/arc ... -
PHP程序员面临的成长瓶颈
2010-10-25 10:06 2023作为Web开发中应用最广泛的语言之一,PHP有着大量的粉丝 ... -
URL重写相关
2010-07-26 18:13 1237初级URL重写指南 http://lamp.lin ... -
关于PHP的mod_rewrite重写模块技术个人觉得最好的一篇文章
2010-07-26 09:30 2276最近手里一个PHP项目要用到mod_rewrite模块,很 ... -
PHP源代码分析- tick(s)
2010-07-24 10:13 1984By Altair, http://www.phpint ... -
php多线程编程
2010-07-21 23:52 1078http://www.cnblogs.com/niniwzw/ ... -
php pcntl_fork和pcntl_fork 的用法
2010-07-21 22:23 2154http://www.jb51.net/article/177 ... -
探讨高并发写入文件内容
2010-07-11 22:48 2837读写相关的问题是永远存在的,文件锁就是为了解决这个问题而做的, ... -
php中,高并发状态下文件的读写
2010-07-11 22:28 8790对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些 ... -
HTTP POST from PHP, without cURL
2010-07-06 17:28 1627Update May 2010: This is one ... -
php fsockopen解决办法。
2010-07-06 15:07 3186Author:David | English Ver ... -
用 PHP V5 开发多任务应用程序
2010-07-04 00:39 1238http://www.ibm.com/developerw ... -
git使用总结
2010-07-02 23:51 1374http://zhwen.org/?p=articles/gi ... -
我说PHPer的水平区分(转载)
2010-07-02 10:55 1480说句实话,写这个真够无 ... -
正则表达式解题经验谈
2010-06-29 22:08 1099正则表达式解题经验谈 ... -
深入浅出之正则表达式
2010-06-28 21:14 805dragon.cnblogs.com/archive/2006 ... -
stream_set_blocking让程序无阻塞
2010-06-28 09:48 1389stream_set_blocking让程序 ... -
什么是Socket?Socket协议的形象描述
2010-06-28 00:11 1594socket的英文原义是“ ... -
完善匹配中文的Php正则表达式
2010-06-11 16:15 2300这段时间试图使用php正 ... -
php反射
2010-06-07 20:14 15241。用途: 该扩展分析php程序,导出或提取出关于类、方法、属 ...
相关推荐
### Linux消息队列分析及应用 #### 一、消息队列基本概念 消息队列(Message Queue)作为Unix系统V版本中的三种进程间通信(Inter-Process Communication, IPC)机制之一,其他两种分别是信号量(Semaphores)和...
4. **内核与消息队列的联系**:内核通过list head结构形成链表来管理消息,msg_msg结构体中的m_list成员连接了这些消息。当消息被添加或删除时,这些链表结构会相应地更新,确保正确地同步和调度进程。 使用Linux...
本教程将深入探讨Linux环境下的消息队列,包括其概念、实现原理、使用方法以及相关的系统调用。 一、消息队列的概念 消息队列是一种存储消息的特殊数据结构,它允许多个进程同时读取和写入。与管道和信号量不同,...
通过学习这些案例,开发者可以深入理解消息队列的工作原理以及如何在实际项目中应用。 描述中提到“Linux环境下编写消息队列”,这可能包括创建、发送、接收消息以及管理和删除消息队列的过程。经典案例通常会涵盖...
在Linux操作系统中,消息队列是一种非常重要的进程间...通过对这些源码的学习,开发者可以深入理解Linux消息队列的工作原理,并能熟练地将其应用于自己的项目中,特别是在驱动开发领域,提高系统间的通信效率和可靠性。
Linux消息队列是一种高效、可靠且灵活的进程间通信(IPC)机制,允许不同进程之间交换...通过深入理解消息队列的工作原理和测试程序的实现,我们可以更好地理解和利用这一强大的通信工具,提升多进程应用的协同效率。
综上所述,《Linux消息队列分析及应用》一文深入剖析了Linux内核中消息队列的工作原理,通过源代码分析,为开发者提供了理解和使用消息队列的实用指南。通过学习和掌握这些知识,开发者能够更好地设计和实现进程间的...
本文将深入探讨Linux消息队列的原理、使用以及在`msg.tar.gz_linux`压缩包中提供的`client.c`和`server.c`示例代码。 **1. Linux消息队列概述** Linux消息队列是内核管理的一种特殊文件,它允许进程存储和检索消息...
### Linux操作系统原理与应用 #### 第一章 操作系统概述 **1.1 什么是GNU?Linux与GNU的关系** GNU(GNU's Not Unix)是一个由自由软件基金会(Free Software Foundation, FSF)发起的项目,旨在创建一套完全自由...
综上所述,"msg.rar_linux 消息队列_linux msgrcv_msg_消息队列"的压缩包提供了学习和实践Linux消息队列通信机制的实例代码,通过对msgsnd.c和msgrcv.c的分析和运行,读者可以深入理解消息队列的工作原理和使用方法...
通过阅读和理解这份源码,开发者能够深入理解Linux内核中的消息队列机制,这对于开发高效、可靠的多进程应用非常有帮助。同时,这也为优化和定制消息队列提供了基础,例如,如果需要实现更高级的调度策略或者更细...
在Linux操作系统中,进程间通信(IPC,...理解并熟练掌握Linux下的消息队列,有助于提升多进程应用的设计和实现能力。为了进一步学习,可以研究`msgq_test`和`MessageTest`这两个文件,通过实践加深对消息队列的理解。
本篇文章将深入探讨开源消息队列服务——httpsqs-1.3在Linux环境下的应用与实现。 一、httpsqs简介 httpsqs是一款针对Unix环境设计的开源消息队列服务。它的主要功能是提供高效、可靠的消息传递机制,支持多种协议...
在实际应用中,等待队列通常用于读写操作的同步。例如,在读取设备时,如果没有可读数据,读进程可以阻塞,等待写进程写入数据。写进程可以唤醒等待队列上的进程, schedule() 函数返回后,读进程继续执行。 等待...
3. **生命周期**:消息队列的生命周期与内核一致,即使创建消息队列的应用程序退出后,消息队列依然存在。 4. **双向通信**:消息队列支持进程间的双向通信。 #### 二、消息队列的使用 Linux系统提供了消息队列的...
本文旨在详细介绍Linux下消息队列的工作原理及其API使用方法。 #### 二、消息队列基础概念 消息队列是系统内核中的数据结构,用于存放来自不同进程的消息。每个消息队列都有一个唯一的标识符(键值),这个键值...
根据给定的信息,我们可以分析并总结出关于进程与消息队列的相关知识点: ### 进程与消息队列的基础概念 1. **进程**:在计算机系统中,进程是正在运行的程序实例。每个进程都有一个独立的地址空间,并且可以执行...
本教程将深入探讨Linux进程间通信中的消息队列,并通过一个基础模型来阐述其工作原理。 消息队列是一种异步通信方法,允许进程发送和接收特定长度的消息,这些消息会被存储在内核维护的队列中,直到被接收方读取。...