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进程间通信之消息队列
本文依据以下思路展开,首先从宏观上阐述消息队列的机制,然后以具体代码为例进一步阐述该机制,最后试着畅想一下该通信机制潜在的应用. 消息队列是在两个不相关进程间传递数据的一种简单.高效方式,她独立于发送 ...
随机推荐
- Mysql 实例:mysql语句练习50题(普通sql写法)
为了练习sql语句,在网上找了一些题,自己做了一遍,收益颇多.很多地方换一种思路,有更好的写法,欢迎指正. 题目地址:https://blog.csdn.net/fashion2014/article ...
- python 面向对象专题(七):异常处理
目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 2.try 6. 常见异常种类 1. ...
- 访问控制列表与SSH结合使用,为网络设备保驾护航,提高安全性
通过之前的文章简单介绍了华为交换机如何配置SSH远程登录,在一些工作场景,需要特定的IP地址段能够SSH远程访问和管理网络设备,这样又需要怎么配置呢?下面通过一个简单的案例带着大家去了解一下. 要实现 ...
- 媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^
之前我媳妇儿让我给她找一个PDF转WORD的免费工具,在网上找了半天发现要不就是收费,要不就是转化的格式混乱.既然网上不能找到好用的免费工具那就直接来写一个吧.人生苦短,我用python. 万能的 ...
- P1525 关押罪犯(洛谷)
前几天没做题,神经有点错乱,感觉一片虚无.今天开始继续写博客. 题目描述 S 城现有两座监狱,一共关押着N名罪犯,编号分别为1-N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件 ...
- javascript : 写一个类似于 jquery css() 的方法
我们知道,jquery css() 方法可以很方便的更改DOM的样式. 但从原理上,这个并不复杂,我们完全可以自己写一个. 上代码. updateDOMStyle(DOM, obj){ Object. ...
- Ubuntu Server 19.04配置静态IP
这个/etc/netplan下默认有个文件50-cloud-init.yaml,直接修改它就行了 sudo vim /etc/netplan/50-cloud-init.yaml 网口名字enp0s3 ...
- 商品表(spu)、规格表(sku)设计
1. 先做一下专业术语解释:spu和sku 这里拿iphone6s举例,它身上有很多的属性和值, 比如: 毛重: 420.00 g 产地: 中国大陆 容量: 16G, 64G, 128G 颜色: 银, ...
- npm 使用报错合集
1.Unexpected end of JSON input while parsing near '...e,"directories":{},"d' 这个问题经常会出 ...
- methodology of english learning
classify the vocabulary into different catigories syllabus about person