Linux系统之《消息队列》入手应用
目录
简述
消息队列是Linux进程间通信方式之一,消息队列一般是用于简单的通信,数据量不大,通信不频繁的情况。如果交互频繁或者数据量大就不适合了。
代码
下面直接上代码,发送端代码:
//file name: msg_test.c
#include "msg_test.h"
//创建消息队列
int Creat_msg(char *path, int id)
{
key_t key;
int msg_id;
puts(path);
if ((key = ftok(path, id)) == -1)
{
perror("ftok");
exit(-1);
}
else
{
printf("key = %d\n", key);
}
if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
{
perror("msgget");
exit(-1);
}
else
{
printf("msg_id = %d\n", msg_id);
}
return msg_id;
}
struct msg
{
long type;
char buf[256+1];
};
int
main(int argc, char **argv)
{
int msgid = 0;
int ret = 0;
struct msg_struct msg_buf;
struct msg buf1;
bzero(&msg_buf, sizeof(msg_buf));
if(argc != 3)
{
printf("Usag: ./%s path id\n", argv[0]);
return 0;
}
printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
msgid = Creat_msg(argv[1], atoi(argv[2]));
printf("msgid = %d\n", msgid);
buf1.type = 0x32;
#if 1
while(1)
{
ret = msgsnd(msgid, (void *)&buf1, 256, 0); //最后一个参数IPC_NOWAIT可以设置非阻塞
//perror("msgrecv");
printf("ret = %d, errno = %d\n", ret, errno);
if(ret < 0 )
{
printf("get ENOMSG\n");
return 0;
}
usleep(2000);
}
#endif
if(msgctl(msgid, IPC_RMID, NULL)< 0)
{
perror("");
}
else
printf("rm OK!");
return 0;
}
接收端代码:
//file name: msg_test.c
#include "msg_test.h"
//创建消息队列
int Creat_msg(char *path, int id)
{
key_t key;
int msg_id;
puts(path);
if ((key = ftok(path, id)) == -1)
{
perror("ftok");
exit(-1);
}
else
{
printf("key = %d\n", key);
}
if ((msg_id = msgget(key, 0666 | IPC_CREAT)) == -1)
{
perror("msgget");
exit(-1);
}
else
{
printf("msg_id = %d\n", msg_id);
}
return msg_id;
}
struct msg
{
long type;
char buf[256+1];
};
int
main(int argc, char **argv)
{
int msgid = 0;
int ret = 0;
struct msg_struct msg_buf;
struct msg buf1;
bzero(&msg_buf, sizeof(msg_buf));
if(argc != 3)
{
printf("Usag: ./%s path id\n", argv[0]);
return 0;
}
printf("path : %s, id = %x\n", argv[1], atoi(argv[2]));
msgid = Creat_msg(argv[1], atoi(argv[2]));
printf("msgid = %d\n", msgid);
#if 1
while(1)
{
ret = msgrcv(msgid, (void *)&buf1, 256, 0x32, 0); //最后一个参数使用IPC_NOWAIT可以设置非阻塞
//perror("msgrecv");
printf("ret = %d, errno = %d\n", ret, errno);
if(ret < 0 )
{
printf("get ENOMSG\n");
return 0;
}
}
#endif
if(msgctl(msgid, IPC_RMID, NULL)< 0)
{
perror("");
}
else
printf("rm OK!");
return 0;
}
编译
gcc msg_send.c -o msg_send
gcc msg_test.c -o msg_recv
运行
接收端:
./msg_recv /tmp/ 1
path : /tmp/, id = 1
/tmp/
key = 16842896
msg_id = 16252928
msgid = 16252928
ret = 256, errno = 0 //接收到数据
ret = 256, errno = 0
发送端:
./msg_send /tmp/ 1
path : /tmp/, id = 1
/tmp/
key = 16842896
msg_id = 16252928
msgid = 16252928
ret = 0, errno = 0 //发送成功
ret = 0, errno = 0
Linux系统之《消息队列》入手应用的更多相关文章
- (转)Linux环境进程间通信----系统 V 消息队列列
转:http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通 ...
- [转]Linux进程间通信——使用消息队列
点击此处阅读原文 另收藏作者ljianhui的专栏初学Linux 下面来说说如何使用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linu ...
- 练习--LINUX进程间通信之消息队列MSG
https://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 继续坚持,或许不能深刻理解,但至少要保证有印象. ~~~~~~~~~~~~~~ 消息队 ...
- Linux进程间通信——使用消息队列
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道 一.什么是消息队列 消息队列提 ...
- Linux下进程间通信--消息队列
消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...
- Linux环境进程间通信----系统 V 消息队列(二)
一.消息队列是一条由消息连接而成的链表,它保存在内核中,通过消息队列的引用标示符来访问. 二.消息队列不同于管道,通信的两个进程可以是完全无关的进程,它们之间不需要约定同步的方法.只要消息队列存在并且 ...
- linux 进程间消息队列通讯
转自:http://blog.csdn.net/lifan5/article/details/7588529 http://www.cnblogs.com/kunhu/p/3608589.html 前 ...
- linux编程之消息队列
消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传递内容,消息顺序地发送到消息队列中,并且以几种不同的方式 从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息 ...
- Linux进程间通信(二) - 消息队列
消息队列 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点(管道请查阅我的另一篇文章 ...
- Linux进程间通信之消息队列
本文依据以下思路展开,首先从宏观上阐述消息队列的机制,然后以具体代码为例进一步阐述该机制,最后试着畅想一下该通信机制潜在的应用. 消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送 ...
随机推荐
- python进阶之内置方法
python进阶之内置方法 字符串类型的内置方法 常用操作与方法: 按索引取值 str[index] 切片 ste[start:stop:step] 长度 len(str) 成员运算in和not in ...
- vue项目发布时去除console语句
在vue.config.js中添加下面的代码即可 // vue-cli version > 3 modeule.exports = { configureWebpack: config => ...
- MYSQL 之 JDBC(七):增删改查(五) DAO设计模式
Data Access Object,数据访问对象 what:访问数据信息的类.包含了对数据的CRUD(create.read.update.delete,增删改查)操作,而不包含任何业务相关的信息. ...
- redis(二十):Redis 架构模式实现(主从复制)
什么是主从复制 我们可以通过slaveof <host> <port>命令,或者通过配置slaveof选项,来使当前的服务器(slave)复制指定服务器(master)的内容, ...
- python 生成器(三):生成器基础(三)生成器表达式
生成器表达式可以理解为列表推导的惰性版本:不会迫切地构建列表,而是返回一个生成器,按需惰性生成元素.也就是说,如果列表推导是制造列表的工厂,那么生成器表达式就是制造生成器的工厂. 示例 14-8 先在 ...
- 爬虫05 /js加密/js逆向、常用抓包工具、移动端数据爬取
爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 目录 爬虫05 /js加密/js逆向.常用抓包工具.移动端数据爬取 1. js加密.js逆向:案例1 2. js加密.js逆向:案例2 3 ...
- CMDB04 /流程梳理、cmdb总结
CMDB04 /流程梳理.cmdb总结 目录 CMDB04 /流程梳理.cmdb总结 1. 流程梳理 1.1 环境 1.2 远程连接服务器 1.3 向服务器上传文件 1.4 运维管理服务器 2. cm ...
- hihoCoder 1052 基因工程 最详细的解题报告
题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...
- 微信小程序动态修改title,动态配置title,动态配置头部,微信小程序动态配置头部
微信小程序的title是在json里面配置的 "navigationBarTitleText": "title名称" 这种title是固定死的不灵活处理一些页面 ...
- Swift开发笔记
Swift开发笔记(一) 刚开始接触XCode时,整个操作逻辑与Android Studio.Visual Studio等是完全不同的,因此本文围绕IOS中控件的设置.事件的注册来简单的了解IOS开发 ...