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进程间通信之消息队列
本文依据以下思路展开,首先从宏观上阐述消息队列的机制,然后以具体代码为例进一步阐述该机制,最后试着畅想一下该通信机制潜在的应用. 消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送 ...
随机推荐
- Pop!_OS配置Python环境
Pop!_OS配置Python环境 #0x0 安装vscode #0x1 配置vscode #0x0 安装vscode 见vscode安装 #0x1 配置vscode 安装Python插件 安装pyl ...
- MySQL入门(函数、条件、连接)
MySQL入门(四) distinct:去重 mysql>: create table t1( id int, x int, y int ); mysql>: insert into t1 ...
- (数据科学学习手札89)geopandas&geoplot近期重要更新
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 最近一段时间(本文写作于2020-07-1 ...
- CTFHub_技能树_SQL注入Ⅱ
SQL注入 MySQL结构 进行尝试: 尝试查看表名: 尝试查看列名: 发现无法直接输出: 使用时间注入脚本跑出结果: import requests import time session = re ...
- 微信小程序wx.switchTab跳转到tab页面后onLoad里面的方法不执行
相信大家在做小程序的时候启动页跳转到tab首页会用到switchTab 但是在跳转后发现页面模块不全,后面console.log()后发现是onLoad里面的方法不执行 解决这种问题的方法页有很多中, ...
- 6 个珍藏已久 IDEA 小技巧,这一波全部分享给你!
每周趣图 产品经理设计体验/用户实际体验 本周就不写技术分析文章了,分享几个珍藏已久的 IDEA 的「骚技巧」,助你快速完成代码. 还等什么?赶紧上车吧...... 先赞后看,养成习惯.微信搜索「程序 ...
- 【C#】根据开始时间和结束时间筛选存在的信息
背景 业务需求中,需要根绝开始时间和结束时间筛选一段时间内的任务存在个数. 示例图片 根据开始时间 9:00到 结束时间11:00 筛选信息 总共有这么四种情况可能出现 插入测试数据 CREATE T ...
- 性能1.84倍于Ceph!网易数帆Curve分布式存储开源
在上周刚结束的网易数字+大会上 网易数帆宣布: 开源一款名为Curve的高性能分布式存储系统, 性能可达Ceph的1.84倍! 网易副总裁.网易杭州研究院执行院长兼网易数帆总经理汪源: 基础软件的能力 ...
- js异步执行原理
我们都知道js是一个单线程的语言,所以没办法同时执行俩个进程.所以我们就会用到异步. 异步的形式有哪些那,es5的回调函数.es6的promis等 异步的运行原理我们可以先看下面这段代码 应该很多人都 ...
- getprop与dumpsys命令
拿到Android手机以后, 想查看一些手机信息. 其实Android获取手机信息就是两个命令, 一个是getprop 一个是dumpsys. dumpsys iphonesubinfo Phone ...