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进程间通信之消息队列
本文依据以下思路展开,首先从宏观上阐述消息队列的机制,然后以具体代码为例进一步阐述该机制,最后试着畅想一下该通信机制潜在的应用. 消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送 ...
随机推荐
- shells学习
shells 脚本 Shell是在Linux内核与用户之间的解释器程序,通常指的是bash,负责向内核翻译及传达用户/程序指令 是liunx系统中的翻译管,解释器类型: ~]#cat /etc/she ...
- 数据可视化之powerBI基础(十一)Power BI中的数据如何导出到Excel中?
https://zhuanlan.zhihu.com/p/64415543 把Excel中数据加载到PowerBI中我们都已经熟悉了,但是怎么把在PowerBI中处理好的数据导出到Excel中呢?毕竟 ...
- 数据可视化之DAX篇(十一)Power BI度量值不能作为坐标轴?这个解决思路送给你
https://zhuanlan.zhihu.com/p/79522456 对于PowerBI使用者而言,经常碰到的一个问题是,想把度量值放到坐标轴上,却发现无法实现.尤其是初学者,更是习惯性的想这么 ...
- POJ 1057 File Mapping 最详细的解题报告
题目来源:POJ 1057 File Mapping 题目大意:像我的电脑那样显示文件夹和文件信息,其中在同一级目录内,文件夹排在文件的前面并且文件夹的顺序不变,同一级目录中文件按字母序排列.文件以‘ ...
- vue中使用elmentUI的Upload组件提交文件和后台接收
1.参考此博客,希望有以下知识储备 vue的路由,跨域请求,springboot2.X,html,已经阅读elementUI官网中关于upload组件的详细介绍. 2.废话不多说,直接讲解细节. 前台 ...
- bzoj2843极地旅行社
bzoj2843极地旅行社 题意: 一些点,每个点有一个权值.有三种操作:点与点连边,单点修改权值,求两点之间路径上点的权值和(需要判输入是否合法) 题解: 以前一直想不通为什么神犇们的模板中LCT在 ...
- ASP.NET Core3.1使用Identity Server4建立Authorization Server-2
前言 建立Web Api项目 在同一个解决方案下建立一个Web Api项目IdentityServer4.WebApi,然后修改Web Api的launchSettings.json.参考第一节,当然 ...
- Python Ethical Hacking - Packet Sniffer(1)
PACKET_SNIFFER Capture data flowing through an interface. Filter this data. Display Interesting info ...
- 为什么在SpringBoot+maven的项目中,所引入的依赖包可以不指定依赖的版本号?
当在Springboot项目中引入了spring-boot-starter-parent,则可以不用引入依赖包版本号,比如: <parent> <groupId>org.spr ...
- python-在python3中使用容联云通讯发送短信验证码
容联云通讯是第三方平台,能够提供短信验证码和语音通信等功能,这里只测试使用短信验证码的功能,因此只需完成注册登录(无需实名认证等)即可使用其短信验证码免费测试服务,不过免费测试服务只能给控制台中指定的 ...