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 ...
随机推荐
- BLE GATT规范中关于UUID与属性的详细解析
1. 角色 除了GAP定义了角色之外,BLE还定义了另外2种角色:GATT服务器和GATT客户端,它们完全独立于GAP的角色.提供数据的设备称为GATT服务器,访问GATT服务器而获得数据的设备称为G ...
- C#调用NPOI组件导出Excel表格
把一个List集合的数据导出到Excel表格中 public static string RenderToExcel<T>(List<T> datas) { MemoryStr ...
- Python基本数据类型之list列表
列表是python中用的非常频繁的数据结构,它是有序序列.之前学的字符串就是一种有序序列.不过列表是可变的. 创建列表 li = list( ) #构 ...
- HTML5 拖拽功能
本地文件拖动到页面实例:(支持IE) <script> var DragFile = function (goalId) { var g = document.getElementById ...
- 软件的NABCD----安装部分
N:需求 有些软件安装需要很多的插件,很很多的安装步骤,甚至文件夹移动等麻烦的步骤 A:做法 做成一键安装的程序 B:好处 默认D盘安装,节省C盘空间,没有赘余插件,一键安装,省时省力. C:竞争 和 ...
- 使用bcrypt进行用户密码加密的简单实现
Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...
- 【转载】拒绝平庸——浅谈WEB登录页面设计
用户活跃度是检验产品成功与否的重要指标之一,传统行业的商家极为重视门面的装潢,因为一个好的门面可以聚集人气,招揽更多的顾客.古时候的大户人家院子门口的石狮子或其他的摆件的摆放极为讲究,有一定的风水学说 ...
- UITextView打开文字中的URL
1. 背景介绍 UITextView里显示的文字带有url,点击url可以打开对应的网页,可以分两种打开方式:(1)在App内打开url:(2)用safari打开url. 2. 实现代码: (1)声明 ...
- EntityFramework更新数据
1.TryUpdateModel 使用很方便,但实际更新数据的过程还是先select,再update.另外发现一个问题,对于input的type类型file的字段,无法使用TryUpdateModel ...
- 学习一下Fiddler的强大
①引言:Fiddler (中文名称:小提琴)是一个 HTTP 的调试代理,以代理服务器的方式,监听系统的Http网络数据流动, Fiddler 可以也可以让你检查所有的 HTTP 通讯,设置断点,以及 ...