linux第10天 msg消息队列
cat /proc/sys/kernel/msgmax最大消息长度限制
cat /proc/sys/kernel/msgmnb消息队列总的字节数
cat /proc/sys/kernel/msgmni消息条目数
消息队列综合案例
//server #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
} \
while(0); struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1024]; /* message data */
}; int main()
{
struct msgbuf revbuf;
int key = 0;
int msgid = 0;
int ret = 0;
int pid = 0; key = ftok("./", '2');
if (key < 0)
ERR_EXIT("ftok"); //获取消息队列
ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
if (ret < 0)
{
if (errno == EEXIST) //如果消息队列已存在
msgid = msgget(key, 0666);
else
ERR_EXIT("msgget:");
}
else
msgid = ret; //设置发送buf
memset(&revbuf, 0, sizeof(revbuf)); revbuf.mtype = 1; //接收方总是接收类型1
while (1)
{
ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), 1, 0);
if (ret < 0)
ERR_EXIT("msgrcv:"); fputs(revbuf.mtext + 4, stdout); pid = *((int *)(revbuf.mtext)); revbuf.mtype = pid;
ret = msgsnd(msgid, &revbuf, ret, IPC_NOWAIT);
if (ret < 0)
ERR_EXIT("msgsnd");
} return 0;
}
//clt #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
} \
while(0); struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1024]; /* message data */
}; int main()
{
struct msgbuf sndbuf;
struct msgbuf revbuf;
int key = 0;
int msgid = 0;
int ret = 0;
int pid = 0; key = ftok("./", '2');
if (key < 0)
ERR_EXIT("ftok"); //获取消息队列
ret = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
if (ret < 0)
{
if (errno == EEXIST) //如果消息队列已存在
msgid = msgget(key, 0666);
else
ERR_EXIT("msgget:");
}
else
msgid = ret; //设置发送buf
memset(&sndbuf, 0, sizeof(sndbuf));
memset(&revbuf, 0, sizeof(revbuf)); pid = getpid(); //获取pid作为包头发出去 while (fgets(sndbuf.mtext + 4, sizeof(sndbuf.mtext), stdin) != NULL)
{
sndbuf.mtype = 1; //发送方总是发送类型1 memcpy(sndbuf.mtext, &pid, 4);
//*((int*)sndbuf.mtext) = pid; //这句话是指将sndbuf.mtext最前面四个字节指向一个int类型指针 ret = msgsnd(msgid, &sndbuf, strlen(sndbuf.mtext + 4) + 4, IPC_NOWAIT);
if (ret < 0)
ERR_EXIT("msgsnd"); sleep(1);
//读取
ret = msgrcv(msgid, &revbuf, sizeof(revbuf.mtext), pid, IPC_NOWAIT);
if (ret < 0)
ERR_EXIT("msgrcv:"); fputs(revbuf.mtext + 4, stdout); memset(&sndbuf, 0, sizeof(sndbuf));
memset(&revbuf, 0, sizeof(revbuf));
}
return 0;
}
linux第10天 msg消息队列的更多相关文章
- Linux网络编程学习(九) ----- 消息队列(第四章)
1.System V IPC System V中引入的几种新的进程间通信方式,消息队列,信号量和共享内存,统称为System V IPC,其具体实例在内核中是以对象的形式出现的,称为IPC 对象,每个 ...
- Linux环境进程间通信(三):消息队列
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- [转]Linux进程通信之POSIX消息队列
进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&am ...
- (转)Linux环境进程间通信----系统 V 消息队列列
转:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通 ...
- Linux:进程通信之消息队列Message实例
/*send.c*/ /*send.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h&g ...
- Linux进程间通信——使用System V 消息队列
消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问 ...
- Linux内核情景分析之消息队列
早期的Unix通信只有管道与信号,管道的缺点: 所载送的信息是无格式的字节流,不知道分界线在哪,也没通信规范,另外缺乏控制手段,比如保温优先级,管道机制的大小只有1页,管道很容易写满而读取没有及时,发 ...
- Linux下进程间通信方式——使用消息队列
一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的 ...
- Linux IPC实践(7) --Posix消息队列
1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...
随机推荐
- phpcms list页实现分页
{pc:content action="lists" catid="41" order="id ASC" num="1" ...
- 启用“关闭自动根证书更新”,解决Windows系统各种卡顿的问题(Visual studio 卡、远程桌面mstsc卡、SVN卡)
最近,发现在Win7下面一系列操作都会出现卡顿的情况: 1. Visual studio 启动调试和关闭调试时,都会卡上半分钟左右 2. 使用远程桌面mstsc.exe,点击连接时,也会卡上半分钟 ...
- C++控制程序只运行一个实例
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ...
- sphinx续5-主索引增量索引和实时索引
原文件地址:http://blog.itpub.net/29806344/viewspace-1400942/ 在数据库数据非常庞大的时候,而且实时有新的数据插入,如果我们不更新索引,新的数据就sea ...
- ArcGIS API for Silverlight中加载Google地形图(瓦片图)
原文:ArcGIS API for Silverlight中加载Google地形图(瓦片图) 在做水利.气象.土地等行业中,若能使用到Google的地形图那是再合适不过了,下面就介绍如何在ArcGIS ...
- 多选列表Select之双击删除与添加Demo
双击任一Select控件,查看效果: srcA srcC srcB targetC targetB targetA 源码: <html> <head> <script ...
- Android笔记:java 中的枚举
部分数据使用枚举比较方便,java中的enmu不如c#中使用方便 记录备忘 以c#中的代码为例 public enum PlayState { /// <summary> /// 关闭 / ...
- Barricade---hdu5889(最短路+网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意:有n个点m条边,每条边的长度相同,我们可以默认为1,构成一个无向图:现在起点为1,终点为n ...
- 【转】Android Canvas的save(),saveLayer()和restore()浅谈
Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22 阅读:1445 评论:0 收藏: ...
- LeetCode Course Schedule II
原题链接在这里:https://leetcode.com/problems/course-schedule-ii/ 题目: There are a total of n courses you hav ...