C++ 多进程学习总结

news/2025/3/4 16:42:48/

C++多进程

进程间通信

消息队列

  • 消息队列:提供一个种进程间发送/接收数据块(常为结构体数据)的方法。

函数接口

  • ftok():获取消息队列键值
  • msgget():创建和访问消息队列
  • msgsnd():向消息队列发送数据
  • msgrcv():从消息队列接收数据
  • msgctl():设置消息队列属性

示例

hpp

#define MSG_PATHNAME	"/tmp"	//系统任意存在的路径名
#define MSG_PROJ		(234)	//1~255任一数字typedef struct _msgSt {int msgType;char msgData[32];
} MsgSt;class IpcMsg
{
public:IpcMsg() {};~IpcMsg() {};int msgInit(){/* 生成key值 */m_msgKey = ftok(MSG_PATHNAME, MSG_PROJ);if (-1 == m_msgKey) {cout << "ftok msgKey error" << endl;return -1;}/*建立消息队列*/m_msgId = msgget(m_msgKey, 0666 | IPC_CREAT);if (-1 == m_msgId) {cout << "msg creat error" << endl;return -1;}return 0;}int msgSend(char *msgBuf, int msgSize){int ret = msgsnd(m_msgId, msgBuf, msgSize, 0);if (ret < 0) {cout << "msgsnd error" << endl;return -1;}return 0;}int msgRecv(char *msgBuf, int msgSize) {int ret = msgrcv(m_msgId, msgBuf, msgSize, 0, 0);if (ret < 0) {cout << "msgrcv error" << endl;return -1;}return ret;}void msgDeinit() {msgctl(m_msgId, IPC_RMID, NULL);}
private:key_t m_msgKey = -1;int m_msgId = -1;
};

cpp

void custom_ipc_msg_process_task(char* argv[]){if (nullptr == argv[1]) {cout << "argv[1] is nullptr" << endl;}string cmd = argv[1];cout << "cmd: " << cmd << endl;IpcMsg ipcMsg;/* 初始化msg */int ret = ipcMsg.msgInit();if (ret < 0) {cout << "msgInit error" << endl;return ;}if (0 == cmd.compare("msgsnd")) {MsgSt msgBuf;while(1){memset(&msgBuf, 0, sizeof(msgBuf));msgBuf.msgType = 1;strncpy(msgBuf.msgData, "msg test", strlen("msg test"));int ret = ipcMsg.msgSend((char *) & msgBuf, (int)sizeof(msgBuf));if (ret < 0) {cout << "msgSend error" << endl;}else {cout << "msgSend ok :" << msgBuf.msgType <<", " <<msgBuf.msgData<< endl;}sleep(3);}}else if (0 == cmd.compare("msgrcv")) {char recvBuf[128];while (1) {memset(recvBuf, 0, sizeof(recvBuf));int ret = ipcMsg.msgRecv(recvBuf, sizeof(recvBuf));if (ret < 0) {cout << "msgrcv error" << endl;}else if(ret == sizeof(MsgSt)) {MsgSt *msgBuf = (MsgSt *)recvBuf;cout << "msgrcv: " << msgBuf->msgType<<", " <<msgBuf->msgData<< endl;}else{cout << "msgrcv size error" << endl;}}}else {cout << "invalid cmd" << endl;}/* 去初始化msg */ipcMsg.msgDeinit();return;
}

测试结果
在这里插入图片描述


http://www.ppmy.cn/news/990471.html

相关文章

v.sqlflow.cn 上线试用

马哈鱼数据血缘工具从2023年8月开始开通国内云版本的服务&#xff0c;相比国外版本&#xff0c;访问速度有很大的提升&#xff0c;访问域名为 https://v.sqlflow.cn. 2023年8月和9月注册的用户可免费获得价值 3000 元的一年高级帐户&#xff0c;可以使用马哈鱼数据血缘工具全部…

【MQTT5】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多&#xff0c;新手可以看下 《【MQTT】Esp32数据上传采集&#xff1a;最新mqtt插件&#xff08;支…

HCIP OSPF的优化总结

OSPF优化 OSPF优化主要目的就是为了减少LSA的更新量&#xff0c;而可以实现者这效果有两种方法 1、路由汇总&#xff0c;可以减少骨干区域的LSA更新量&#xff1b; 2、做OSPF特殊区域&#xff0c;可以减少非骨干区域的更新量。 OSPF的汇总分为两种 1、域间路由汇总 区域间…

浅谈大数据软件的功能性分析

在当今时代的潮流中&#xff0c;工作中遇到大数据处理的时候非常多&#xff0c;因此需要一些大数据分析软件帮助人们进行工作。由于这些软件针对的对象不同&#xff0c;因此使用方法也不同&#xff0c;那么为了帮助更多的人了解大数据分析软件&#xff0c;我们就对这些软件的功…

0基础系列C++教程 从0开始 第四课

目录 来学习新的内容吧 1 输入 第四课课后习题1&#xff1a; 2 变量 怎么定义变量&#xff1f; 定义变量 第四课课后习题2&#xff1a; 来学习新的内容吧 1 输入 C中既然有了输出 那必然有输入 这时 我们就要用到 cin 函数啦 cin 用法与cout 相似 但却有一个差异 co…

MybatisPlus拓展篇

文章目录 逻辑删除通用枚举字段类型处理器自动填充功能防全表更新与删除插件MybatisX快速开发插件插件安装逆向工程常见需求代码生成 乐观锁问题引入乐观锁的使用效果测试 代码生成器执行SQL分析打印多数据源 逻辑删除 逻辑删除的操作就是增加一个字段表示这个数据的状态&…

IDEA好用的插件总结

IdeaVim 这个看个人喜好&#xff0c;我比较喜欢用vim&#xff0c;并且支持自定义修改按键绑定alibaba java code guidelines alibaba的java编程规范plantUML 绘制UML&#xff0c;支持语言显示plantUML integration 能够直接将代码转化为UML图&#xff0c;非常方便rainbow brack…

VScode的简单使用

一、VScode的安装 Visual Studio Code简称VS Code&#xff0c;是一款跨平台的、免费且开源的现代轻量级代码编辑器&#xff0c;支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性&#xff0c;也拥有对git的开箱…