Linux IPC实践(6) --System V消息队列(3)
消息队列综合案例
消息队列实现回射客户/服务器
server进程接收时, 指定msgtyp为0, 从队首不断接收消息
server进程发送时, 将mtype指定为接收到的client进程的pid
client进程发送的时候, mtype指定为自己进程的pid
client进程接收时, 需要将msgtyp指定为自己进程的pid, 只接收消息类型为自己pid的消息;
// client/server进程接收/发送的数据结构
const int MSGMAX = 8192;
struct msgBuf
{
long mtype; //保存客户进程的pid(需要将pid强制转换成为long)
char mtext[MSGMAX]; //保存客户进程真实发送的数据
};
//server.cpp
void echoServer(int msgid)
{
struct msgBuf buf;
int nrcv;
while (true)
{
bzero(&buf, sizeof(buf));
if ((nrcv = msgrcv(msgid, &buf, sizeof(buf.mtext), 0, 0)) == -1)
err_exit("msgrcv error");
cout << "recv: " << buf.mtext;
if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1)
err_exit("msgsnd error");
}
}
int main()
{
key_t key = ftok("/tmp/echoSeed", 0x1234);
int msgid = msgget(key, IPC_CREAT|0666);
if (msgid == -1)
err_exit("msgget error");
echoServer(msgid);
}
//client.cpp
void echoServer(int msgid)
{
struct msgBuf buf;
int nrcv;
while (true)
{
bzero(&buf, sizeof(buf));
if ((nrcv = msgrcv(msgid, &buf, sizeof(buf.mtext), 0, 0)) == -1)
err_exit("msgrcv error");
cout << "recv: " << buf.mtext;
if (msgsnd(msgid, &buf, strlen(buf.mtext), 0) == -1)
err_exit("msgsnd error");
}
}
int main()
{
key_t key = ftok("/tmp/echoSeed", 0x1234);
int msgid = msgget(key, IPC_CREAT|0666);
if (msgid == -1)
err_exit("msgget error");
echoServer(msgid);
}
附-ftok用法
#include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id);
描述信息:
The ftok() function uses the identity(象征) of the file named by the given pathname (which must refer
to an existing, accessible file[必须是一个已经存在,并且可访问的文件]) and the least significant(有效的) 8 bits[有效的最低8位] of proj_id (which must be nonzero) to generate a key_t type System V IPC key, suitable
for use with msgget(2), semget(2), or shmget(2). The resulting value is the same for all pathnames that name the same file, when the same value of proj_id
is used(如果文件名与proj_id的有效位全都相同的话, 则生成的key一定也是相同的). The value returned should be different when
the (simultaneously existing) files or the project IDs differ.
RETURN VALUE On success, the generated key_t value is returned. On failure -1 is returned,
with errno indicating the error as for the stat(2) system call.
Linux IPC实践(6) --System V消息队列(3)的更多相关文章
- Linux IPC实践(4) --System V消息队列(1)
消息队列概述 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限于本机); 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值. 消息队列也有管道一样的不足: ...
- Linux IPC实践(5) --System V消息队列(2)
消息发送/接收API msgsnd函数 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 参数 msgid: 由ms ...
- Linux进程通信之System V消息队列
System V消息队列是Open Group定义的XSI,不属于POSIX标准.System V IPC的历史相对很早,在上个世70年代后期有贝尔实验室的分支机构开发,80年代加入System V的 ...
- linux c编程:System V消息队列一
消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足 够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进 ...
- linux网络编程之system v消息队列(二)
今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...
- Linux IPC实践(13) --System V IPC综合实践
实践:实现一个先进先出的共享内存shmfifo 使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速; 我们首先完成C语言版本的shmfifo(基于过程调用) ...
- Linux IPC实践(11) --System V信号量(1)
信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...
- linux网络编程之system v消息队列(一)
经过上次对于进程通讯的一些理论的认识之后,接下来会通过实验来进一步加深对进程通讯的认识,话不多说,进入正题: 其实还可以通过管道,但是,管道是基于字节流的,所以通常会将它称为流管道,数据与数据之间是没 ...
随机推荐
- hadoop hdfs 高可用
单点故障: 如果某一个节点或服务出了问题,导致服务不可用 单点故障解决方式: 1.给容易出故障的地方安排备份 2.一主一备,要求同一时刻只能有一个对外提供服务 3.当active挂掉之后,standb ...
- redis在java客户端的操作
redis高性能,速度快,效率高的特点,用来做缓存服务器是很不错的选择.(和memcache相似)redis在客户端的操作步骤: 1.redis单机版操作 1.1通过Jedis对象操作 (1)将安装r ...
- plsql和tsql常用函数比较
数学函数 .绝对值 S:) value O:) value from dual .取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) ...
- Python中的转义
在Python交互式解释器中,输出的字符串会用引号引起来,特殊字符会用反斜杠(\)转义.如果遇到带有\的字符被当作特殊字符时,有以下两种处理方法:1.使用双反斜杠(\\)来转义2.使用原始字符串,方法 ...
- Spring Security基于Java配置
Maven依赖 <dependencies> <!-- ... other dependency elements ... --> <dependency> < ...
- Hadoop加速器GridGain
GridGain的Hadoop加速器 像GridGain等内存网格产品(IMDG)不仅可以作为简单的缓存,加速Hadoop中MapReduce计算也是IMDG的一个亮点.这样内存计算领域又多了一种思路 ...
- Java中使用long类型实现精确的四则运算
引子 Effective Java 2nd Edition 第48条建议:如果需要精确的答案,请避免使用float和doble.float和double类型主要是为了科学计算和工程计算而设计的.他们执 ...
- 实例演示如何在spring4.2.2中集成hibernate5.0.2并创建sessionFactory
本文地址:http://blog.csdn.net/sushengmiyan/article/details/49388209 文章作者:苏生米沿 本文目的:使用spring4.2.2集成hibern ...
- PGM:部分有向模型之条件随机场与链图模型
http://blog.csdn.net/pipisorry/article/details/52529287 贝叶斯网与马尔可夫网 [PGM:无向图模型:马尔可夫网]中例3.8和例4.8显示,贝叶斯 ...
- Spring之MVC模块
Spring MVC的Controller用于处理用户的请求.Controller相当于Struts 1里的Action,他们的实现机制.运行原理都类似 Controller是个接口,一般直接继承Ab ...