Linux消息队列
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h> int msg_key = ; struct MsgNode
{
long nMsgType;
char sBuf[];
}; int main(int argc,char** argv)
{
int nMsgId = ;
if((argc == ) && (strcmp(argv[],"c") == ))
{
nMsgId = msgget(msg_key,IPC_EXCL);
if(nMsgId < )
{
nMsgId = msgget(msg_key,|IPC_CREAT);
if(nMsgId < )
{
perror("msgget");
printf("msgget failed\n");
exit(-);
}
} for(int i = ;i < ; ++i)
{
MsgNode node;
node.nMsgType = ;
sprintf(node.sBuf,"This is the %d msg from client.\n",i); if(i == )
{
strcpy(node.sBuf,"end\n");
} printf("%s",node.sBuf); int ret = msgsnd(nMsgId,&node,sizeof(node.sBuf),IPC_NOWAIT);
if(ret < )
{
perror("msgsend");
printf("msgsend failed");
exit(-);
}
}
}
else
{
nMsgId = msgget(msg_key,IPC_EXCL);
if(nMsgId < )
{
printf("msgget failed\n");
exit(-);
} bool flag = true;
while(flag)
{
MsgNode node;
int ret = msgrcv(nMsgId,&node,sizeof(node.sBuf),,IPC_NOWAIT);
if(ret == -)
{
perror("msgrecv");
printf("msgrecv failed\n");
exit(-);
}
printf("Receive Msg:%s",node.sBuf);
//if(strncmp(node.sBuf,"end",3) == 0)
//{
// flag = false;
//};
} int ret = msgctl(nMsgId,IPC_RMID,);
if( ret == -)
{
printf("msgctl failed\n");
exit(-);
}
} return ;
}
需要注意的是
int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
及
int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);
其中 size_t msg_st并不是消息结构体的大小,而是消息的大小。
如代码中定义了结构
struct MsgNode
{
long nMsgType;
char sBuf[];
};
则 size_t msg_st指的是 sizeof(MsgNode.sBuf)即不包括结构中消息类型的长度。
在接受/发送消息时如果不设置为IPC_NOWAIT则发送时如果消息队列已满则阻塞,接收时如果消息队列为空则阻塞。
Linux消息队列的更多相关文章
- linux消息队列编程实例
转自:linux 消息队列实例 前言: 消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权 ...
- LINUX消息队列实战之一
前言 能说能抄能论皆不算,能写能打才是真功夫. 唠叨 反正我也是一个孤独的程序猿,多说一些奇奇怪怪的唠叨也无妨,第一次写消息队列,书本的东西和实战很不同,根据实战总结的一些注意事项会和大家分享,也敲打 ...
- linux 消息队列的限制
消息队列的系统限制 作者:冯老师,华清远见嵌入式学院讲师. 消息队列是System V的IPC对象的一种,用于进程间通信,会受到系统的限制,本文主要描述了三个限制.第一:议个消息的最大长度:第二:消息 ...
- linux消息队列通信
IPC机制 进程间通信机制(Inter Process Communication,IPC),这些IPC机制的存在使UNIX在进程通信领域手段相当丰富,也使得程序员在开发一个由多个进程协作的任务组成的 ...
- Linux消息队列应用
#include"sys/types.h" #include "sys/msg.h" #include "unistd.h" #includ ...
- linux消息队列操作
对消息队列的操作无非有以下三种类型: 1. 打开或创建消息队列消息队列的内核持续性要求每一个消息队列都在系统范围内相应唯一的键值,所以,要获得一个消息队列的描写叙述字,仅仅需提供该消息队列的键值就可以 ...
- linux消息队列的使用
消息队列 *消息队列是内核地址空间中的内部链表,通过内核在各个进程之间传递的内容.消息顺序发送到消息队列中,每个消息队列都有IPC标识符唯一地进行标识. msgbuf结构 struct msgbuf{ ...
- Linux 消息队列编程
消息队列.信号量以及共享内存被称作 XSI IPC,它们均来自system V的IPC功能,因此具有许多共性. 键和标识符: 内核中的每一种IPC结构(比如信号量.消息队列.共享内存)都用一个非负整数 ...
- linux 消息队列
消息队列,这个可是鼎鼎大名,经常在某些地方看见大家那个膜拜,那个,嗯,那个... 那就给个完整的例子,大家欣赏就行,我一直认为不用那个,嗯@ 这个队列的最大作用就是进程间通信,你要非搞个持久化,那也行 ...
随机推荐
- Storm系列(十六)架构分析之Executor-Bolt
准备消息循环的数据 函数原型: 1 let[executor-sampler (mk-stats-sampler (:storm-conf executor-data))] 主要功能: 定义tupl ...
- Hadoop工程师面试题(1)--MapReduce实现单表汇总统计
数据源格式描述: 输入t1.txt源数据,数据文件分隔符"*&*",字段说明如下: 字段序号 字段英文名称 字段中文名称 字段类型 字段长度 1 TIME_ID 时间(到时 ...
- HW5.4
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- C#如何转换2位数字表示的年
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:C#如何转换2位数字表示的年.
- Moq4在.NET3.5和.NET4版本之间的差异
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Moq4在.NET3.5和.NET4版本之间的差异.
- Mybatis上路_05-使用命令行自动生成
http://my.oschina.net/vigiles/blog/125127 目录[-] 1.数据准备: 1)建库: 2)建表: 3)预设数据: 2.编写Generator执行配置文件: 3.搭 ...
- kcachegrind gui for callgrind
DocumentationScreenshotsDownload/SourcesLinksRoadmapBugs & Wishes This is the homepage of the pr ...
- find——文件查找命令 linux一些常用命令
find 命令eg: 一般文件查找方法: 1. find /home -name file , 在/home目录下查找文件名为file的文件2. find /home -name '*file ...
- 如何实现windows和linux之间的文件传输
2010-04-25 18:10 如何实现windows和linux之间的文件传输 如果想从windows中传送大量文件到Linux中,想必会难倒部分Linux初学者,尤其是文件很大时.我曾试过在li ...
- Iperf使用方法
Iperf使用方法 Iperf 是一个网络性能测试工具.Iperf可以测试TCP和UDP带宽质量.Iperf可以测量最大TCP带宽,具有多种参数和UDP特性.Iperf可以报告带宽,延迟抖动和数据包 ...