博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 进程间通信(posix消息队列 简单)实例
阅读量:5812 次
发布时间:2019-06-18

本文共 4429 字,大约阅读时间需要 14 分钟。

Linux 进程间通信(posix消息队列 简单)实例详情见: http://www.linuxidc.com/Linux/2011-10/44828.htm编译:gcc -o consumer consumer.c -lrtgcc -o producer producer.c -lrt/* * *       Filename:  producer.c * *    Description:  生产者进程 * *        Version:  1.0 *        Created:  09/30/2011 04:52:23 PM *       Revision:  none *       Compiler:  gcc(g++) * *         Author:  |Zhenghe Zhang|, |zhenghe.zhang@gmail.com| *        Company:  |Shenzhen XXX Technology Co., Ltd.| * */#include 
#include
#include
#include
#include
#include
#include
#define MAXSIZE 10 //定义buf大小#define BUFFER 8192 //定义Msg大小struct MsgType{ int len; char buf[MAXSIZE]; char x; short y;};可以用这种形式传递参数int main() { /*消息队列*/ mqd_t msgq_id; struct MsgType msg; unsigned int prio = 1; unsigned int send_size = BUFFER; struct mq_attr msgq_attr; const char *file = "/posix"; /*mq_open() for creating a new queue (using default attributes) */ /*mq_open() 创建一个新的 POSIX 消息队列或打开一个存在的队列*/ msgq_id = mq_open(file, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, NULL); if(msgq_id == (mqd_t)-1) { perror("mq_open"); exit(1); } /* getting the attributes from the queue -- mq_getattr() */ if(mq_getattr(msgq_id, &msgq_attr) == -1) { perror("mq_getattr"); exit(1); } printf("Queue \"%s\":\n\t- stores at most %ld messages\n\t- \ large at most %ld bytes each\n\t- currently holds %ld messages\n", file, msgq_attr.mq_maxmsg, msgq_attr.mq_msgsize, msgq_attr.mq_curmsgs); /*setting the attributes of the queue -- mq_setattr() */ /*mq_setattr() 设置消息队列的属性,设置时使用由 newattr 指针指向的 mq_attr 结构的信息。*/ /*属性中只有标志 mq_flasgs 里的 O_NONBLOCK 标志可以更改,其它在 newattr 内的域都被忽略 */ if(mq_setattr(msgq_id, &msgq_attr, NULL) == -1) { perror("mq_setattr"); exit(1); } int i = 0; while(i < 10) { msg.len = i; memset(msg.buf, 0, MAXSIZE); sprintf(msg.buf, "0x%x", i); msg.x = (char)(i + 'a'); msg.y = (short)(i + 100); printf("msg.len = %d, msg.buf = %s, msg.x = %c, msg.y = %d\n", msg.len, msg.buf, msg.x, msg.y); /*sending the message -- mq_send() */ /*mq_send() 把 msg_ptr 指向的消息加入由 mqdes 引用的消息队列里。*/ /*参数 msg_len 指定消息 msg_ptr 的长度:这个长度必须小于或等于队列 mq_msgsize 属性的值。零长度的消息是允许。*/ if(mq_send(msgq_id, (char*)&msg, sizeof(struct MsgType), prio) == -1) { perror("mq_send"); exit(1); } i++; sleep(1); } sleep(30); //等待消费者进程退出 这个意思就是先让生产者执行,但是消费者必须在30秒内执行,不然就会出问题 /*closing the queue -- mq_close() */ /*mq_close() 关闭消息队列描述符 mqdes。如果调用进程在消息队列 mqdes 绑定了通知请求,*/ /*那么这个请求被删除,此后其它进程就可以绑定通知请求到此消息队列。*/ if(mq_close(msgq_id) == -1) { perror("mq_close"); exit(1); } /*mq_unlink() 删除名为 name 的消息队列。消息队列名将被直接删除。*/ /*消息队列本身在所有引用这个队列的描述符被关闭时销毁。*/ if(mq_unlink(file) == -1) { perror("mq_unlink"); exit(1); } return 0; } /* * * Filename: consumer.c * * Description: 消费者进程 * * Version: 1.0 * Created: 09/30/2011 04:52:23 PM * Revision: none * Compiler: gcc(g++) * * Author: |Zhenghe Zhang|, |zhenghe.zhang@gmail.com| * Company: |Shenzhen XXX Technology Co., Ltd.| * */#include
#include
#include
#include
#include
#include
#include
#define MAXSIZE 10 //定义buf大小#define BUFFER 8192 //定义Msg大小struct MsgType{ int len; char buf[MAXSIZE]; char x; short y;};int main() { /*消息队列*/ mqd_t msgq_id; struct MsgType msg; unsigned int sender; struct mq_attr msgq_attr; unsigned int recv_size = BUFFER; const char *file = "/posix"; /* mq_open() for opening an existing queue */ msgq_id = mq_open(file, O_RDWR); if(msgq_id == (mqd_t)-1) { perror("mq_open"); exit(1); } /* getting the attributes from the queue -- mq_getattr() */ if(mq_getattr(msgq_id, &msgq_attr) == -1) { perror("mq_getattr"); exit(1); } printf("Queue \"%s\":\n\t- stores at most %ld messages\n\t- \ large at most %ld bytes each\n\t- currently holds %ld messages\n", file, msgq_attr.mq_maxmsg, msgq_attr.mq_msgsize, msgq_attr.mq_curmsgs); if(recv_size < msgq_attr.mq_msgsize) recv_size = msgq_attr.mq_msgsize; int i = 0; while(i < 10) //运行一个consumenr,为 10 ,同时运行两个consumer进程,为 5 { msg.len = -1; memset(msg.buf, 0, MAXSIZE); msg.x = ' '; msg.y = -1; /* getting a message */ /*mq_receive() 从由描述符 mqdes 引用的队列时删除优先级最高的最老的消息,并把放置到 msg_ptr 的缓存区内。*/ /*参数 msg_len 指定缓冲区 msg_ptr 的大小:它必须大于队列的 mq_msgsize 属性(参数 mq_getattr)。*/ /*如果 prio 不是 NULL,那么它指向的内存用于返回收到消息相关的优先级。*/ if (mq_receive(msgq_id, (char*)&msg, recv_size, &sender) == -1) { perror("mq_receive"); exit(1); } printf("msg.len = %d, msg.buf = %s, msg.x = %c, msg.y = %d\n", msg.len, msg.buf, msg.x, msg.y); i++; sleep(2); } if(mq_close(msgq_id) == -1) { perror("mq_close"); exit(1); } return 0; }

 

转载地址:http://csvbx.baihongyu.com/

你可能感兴趣的文章
iOS 绝对路径和相对路径
查看>>
使用Openfiler搭建ISCSI网络存储
查看>>
iOS - UIViewController
查看>>
IntPtr 转 string
查看>>
学生名单
查看>>
(转) 多模态机器翻译
查看>>
【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档
查看>>
矩阵常用归一化
查看>>
Oracle常用函数总结
查看>>
【聚能聊有奖话题】Boring隧道掘进机完成首段挖掘,离未来交通还有多远?
查看>>
USNews大学排名遭美国计算机研究学会怒怼,指排名荒谬要求撤回
查看>>
struts1——静态ActionForm与动态ActionForm
查看>>
七大关键数据 移动安全迎来历史转折点
查看>>
在AngularJS中学习javascript的new function意义及this作用域的生成过程
查看>>
盘点物联网网关现有联网技术及应用场景
查看>>
1、下载安装scala编译器(可以理解为scala的jdk),地址:http://www.scala
查看>>
mui 总结2--新建第一个app项目
查看>>
nginx的lua api
查看>>
考研太苦逼没坚持下来!看苑老师视频有点上头
查看>>
HCNA——RIP的路由汇总
查看>>