- 浏览: 771771 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
msgget函数用于创建一个新的消息队列或访问一个已存在的消息队列
IPC_NOWAIT标志使得msgsend调用非阻塞:如果没有存放新消息的可用空间,该函数就马上返回.这个条件可能发生的情况包括:
1.在指定的队列中已有太多的字节
2.在系统范围存在太多的消息
如果这两个条件中有一个存在,而且IPC_NOWAIT标志已指定,msgsnd就返回一个EAGAIN错误.如果这两个条件中有一个存在,但是IPC_NOWAIT标志未指定,那么调用纯种被投入睡眠.直到:
1.具备存放新消息的空间
2.由msqid标识的消息队列从系统中删除(这种情况下返回一个EIDRM错误)
3.调用线程被某个捕获的信号反中断(这种情况下返回一个EINTR错误)
msgctl函数提供一个消息队列上的各种控制操作
http://dash1982.iteye.com/blog/296583
MsgQueue.h
MsgQueue.cpp
test
IPC_NOWAIT标志使得msgsend调用非阻塞:如果没有存放新消息的可用空间,该函数就马上返回.这个条件可能发生的情况包括:
1.在指定的队列中已有太多的字节
2.在系统范围存在太多的消息
如果这两个条件中有一个存在,而且IPC_NOWAIT标志已指定,msgsnd就返回一个EAGAIN错误.如果这两个条件中有一个存在,但是IPC_NOWAIT标志未指定,那么调用纯种被投入睡眠.直到:
1.具备存放新消息的空间
2.由msqid标识的消息队列从系统中删除(这种情况下返回一个EIDRM错误)
3.调用线程被某个捕获的信号反中断(这种情况下返回一个EINTR错误)
msgctl函数提供一个消息队列上的各种控制操作
http://dash1982.iteye.com/blog/296583
MsgQueue.h
#ifndef MSGQUEUE_H #define MSGQUEUE_H namespace Utility { #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH) #define COMMON_MESSAGE 1 struct Message { long msgType; int bufLen; int addr;//地址 int reserved1; int reserved2; }; //初始化消息队列 int initMessageQueue(const char* msgfile,int& msgId,int msgType); //关闭消息队列 int closeMessageQueue(int& msgId); //清空消息 void clearMessage(int key,int& msgId,int msgType); //发送普通消息 int sendMessage(const Message &msg,int msgId); }//end of namespace Utility #endif // MSGQUEUE_H
MsgQueue.cpp
#include "MsgQueue.h" #include <sys/msg.h> #include <string.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <iostream> using namespace std; namespace Utility { /* 清空消息 */ void clearMessage(int key,int& msgId,int msgType) { int ret = 0; msgId = msgget(key, 0660); if (msgId<0){ return; } while (1) { if(msgType==COMMON_MESSAGE) { Message msg; bzero(&msg,sizeof(msg)); ret=msgrcv(msgId, &msg, sizeof(msg), 0, IPC_NOWAIT); if(ret<0){ break; } } } } /* 初始化消息队列 */ int initMessageQueue(const char* msgFile,int & msgId,int msgType) { //删除文件,避免引起不必要的问题,不删除可能会造成msgsend时卡死或发送失败的现象 unlink(msgFile); msgId = -1; int fid = open(msgFile, O_RDWR | O_CREAT, FILE_MODE); if(fid<0) { cout << "创建文件:" << msgFile << "失败!" << endl; return fid; } close(fid); int key = ftok(msgFile, 'a'); if(key<0) { cout << "创建消息队列失败!" << endl; return key; } if((msgId = msgget(key, IPC_CREAT | IPC_EXCL | 0660))==-1) { clearMessage(key,msgId,msgType); if (msgId<0) { cout << "创建消息队列失败!" << strerror(errno) << endl; return msgId; } } cout << "初始化消息队列成功.msgFile:" << msgFile << ",msgId:" << msgId << endl; return 0; } /* 关闭消息队列 */ int closeMessageQueue(int& msgId) { int tmpMsgId = msgId; int ret = msgctl(msgId, IPC_RMID, 0); if(ret<0){ cout << "关闭消息队列失败" << endl; }else{ cout << "关闭消息队列成功,msgId:" << tmpMsgId << endl; } return ret; } /* 发送普通信息 */ int sendMessage(const Message &msg,int msgId) { int ret = msgsnd(msgId, &msg, sizeof(msg), IPC_NOWAIT); if(ret<0){ cout << "向消息队列发送消息失败,msgId:" << msgId << endl; }else{ cout << "向消息队列发送消息成功,msgId:" << msgId << ",长度:" << msg.bufLen << endl; } return ret; } }//end of namespace Utility
test
#include "MsgQueue.h" #include <pthread.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <unistd.h> #include <iostream> using namespace std; using namespace Utility; int g_msgId = 0; class A { public: int value; }; void* testRecvMessage(void*) { Message msg;//收数据的结构体 char rcvbuf[100]; bzero(rcvbuf,100); int ret = 0; while(true) { ret = msgrcv(g_msgId, &msg, sizeof(msg), 0, IPC_NOWAIT); if (-1 != ret) { if(msg.msgType==COMMON_MESSAGE) { A** a = (A**)(msg.addr); cout << "bufLen:" << msg.bufLen << ",value:" << (*a)->value << endl; delete *a; *a = NULL; msg.addr = 0; } break; }else { usleep(1000); } } pthread_detach(pthread_self()); return 0; } int main() { pthread_t pid; pthread_create(&pid,NULL,testRecvMessage,NULL); int msgType = COMMON_MESSAGE; initMessageQueue("/tmp/test1.msg",g_msgId,msgType); A* a = new A; a->value = 10; Message message; bzero(&message,sizeof(message)); message.msgType = COMMON_MESSAGE; message.bufLen = sizeof(message); message.addr = (int)&a; sendMessage(message,g_msgId); sleep(5); closeMessageQueue(g_msgId); } 初始化消息队列成功.msgFile:/tmp/test1.msg,msgId:32769 向消息队列发送消息成功,msgId:32769,长度:20 bufLen:20,value:10 关闭消息队列成功,msgId:32769
发表评论
-
滑动窗口与拥塞控制
2017-09-29 14:47 764滑动窗口:用作流量控制: 1.发送端和接收端各维护一个独立的发 ... -
rawsocket发送tcp包
2017-09-25 11:52 990testTcp.h #ifndef TESTTCP_H ... -
柔性数组
2017-09-20 09:53 512#include <iostream> #i ... -
rawsocket发送dns包
2017-09-14 15:18 620#include <stdio.h> #in ... -
rawsocket发送icmp包
2017-09-06 09:54 668#include <stdio.h> #in ... -
查看glibc版本
2016-12-07 14:13 553strings /lib64/libc.so.6 |grep ... -
netfilter
2016-10-04 20:31 487http://blog.chinaunix.net/uid-2 ... -
gdb的简单使用
2016-09-19 15:18 423注意编译的时间加上-g参数 1.调试运行 gdb a.out ... -
TCP各状态的意义
2016-03-01 14:06 428各个状态的意义如下: LISTEN - 侦听来自远方TCP端 ... -
trim
2015-05-14 14:45 371/* trim from start */ ... -
log
2015-03-30 17:42 458log.h #ifndef __LOG_H__ #def ... -
TIMEWAIT与CLOSEWAIT
2015-03-17 11:32 667http://blog.csdn.net/kobejayand ... -
TcpClient
2015-01-16 17:46 476TcpClient.h #ifndef TCPCLIENT ... -
信号量
2014-09-26 10:20 688#include <semaphore.h> ... -
共享内存
2014-09-17 10:39 606SharedMemory.h #ifndef SHARED ... -
记录锁
2014-09-11 16:32 446#include <errno.h> #in ... -
popen
2014-09-06 14:50 645#include <stdio.h> #in ... -
大小端存储
2014-09-05 09:29 613#include <stdio.h> i ... -
条件变量(cond)
2014-09-01 11:02 893#include <pthread.h> # ... -
读写锁
2014-09-01 10:33 738#include <pthread.h> # ...
相关推荐
springboot167基于springboot的医院后台管理系统的设计与实现,含有完整的源码和报告文档
XGigE IP GigE Vision Streaming Protocol VHDL源码 有基于AC701 FPGA板卡的完整的参考工程
fluent重叠网格动网格,振荡翼型加摆动后缘小翼算例文件,udf文件,视频教程 流体力学,航空航天,船舶海洋,土木工程,能源动力专业必备
springboot174基于springboot的疾病防控综合系统的设计与实现,含有完整的源码和报告文档
SIGIR'22-减少虚假新闻检测中的实体偏差-论文复制_ ENDEF_glj
Vue3 是 Vue.js 框架的最新版本,它带来了许多重要的更新和改进,旨在提升开发效率、性能和可维护性。在这个名为“vue3-demo2”的项目中,我们可以探索 Vue3 的核心特性以及如何在实际应用中使用它们。
计算 Freeman 链代码以及边界的第一个差值和形状编号MATLAB代码.rar
dsp28335电机控制板zi料(软件代码) 1.永磁同步电机有传感器三闭环foc控制代码 2.永磁同步电机无传感器双闭环foc控制代码 3.无刷直流电机有传感器方波控制代码 4.异步电机V F变频调速控制代码 控制板和驱动版硬件电子资料+软件程序CCS6.0环境下运行
以下是校园二手书交易系统的功能描述,旨在促进学生之间的二手书交易,提高资源利用率和降低学习成本。 校园二手书交易系统功能描述 1. 用户角色 学生/买家 学生/卖家 管理员 2. 功能描述 学生/买家功能 用户注册与登录 支持使用邮箱、手机号或社交媒体账号注册和登录。 提供个人资料管理功能,包括用户名、联系方式等。 浏览与搜索 浏览二手书列表,可以按类别(教材、文学、参考书等)、价格区间、书名等进行筛选。 提供关键词搜索功能,快速找到需要的书籍。 书籍详情查看 查看书籍的详细信息,包括书名、作者、出版社、ISBN、成色、价格及卖家信息。 显示书籍的图片,以便更好地了解书籍状态。 在线购买 向卖家发送购买请求,支持订单确认和支付流程。 提供多种支付方式,如支付宝、微信支付等,方便快捷。 评价与反馈 对完成交易的卖家进行评价,提供反馈以帮助其他用户选择。 举报不良行为或虚假信息,维护交易环境的安全性。 收藏与关注 收藏感兴趣的书籍,便于后续查找。 关注卖家,接收其新上架书籍的通知。 学生/卖家功能 书籍发布 提供简单易用的书籍发布界面,填写书籍信息(如书名、作者、价格、成色
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
微信小程序-大树洞2.0 - 基于 WePY_szushudong
安徽打算几点刚把手机官方还是
网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面,个人大四毕业设计项目、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测的网课专注度检测系统源码+模型+pyqt5界面网课专注度监测预警系统基于yolov5目标检测
comsol亚波长超声聚焦 仿真 生物超声、高强度聚焦能器 超声能器 超声传感器 MEMS PMUT PVDF压电能量收集器 1-3复合压电陶瓷 1-2复合压电陶瓷设计 超声匹配层研究 等等
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
springboot186人格障碍诊断系统,含有完整的源码和报告文档
WooCommerce微信小程序_从oocommerce到微信微信
python 一个基于基于python的人脸识别签到系统.zip 一个基于基于python的人脸识别签到系统.zip
springboot184基于springboot的校园网上店铺的设计与实现,含有完整的源码和报告文档
基于特征的视网膜图像配准Matlab代码.rar