Linux 基本语句_13_消息队列

概念:

不同进程能通过消息队列来进行通信,不同进程也能获取或发送特定类型的消息,即选择性的收发消息。

一般一个程序采取子进程发消息,父进程收消息的模式

常用函数功能:

fork(); // 创建子进程

struct msgbuf{ // 数据协议long mtype; // 数据类型,由用户自己定义char buf[N]; // 数据部分
};

key = ftok(“.”, ‘a’) // 创建键值

第一个参数是路径名,通常是一个已经存在的文件或目录的路径名。在这个例子中,.表示当前目录,也就是代码所在的目录。
第二个参数是一个由用户自定义的字符,用于生成键值。在这里,它是字符 ‘a’。

这个键值的作用即标识一个消息队列,通过键值识别具体的某条消息队列


代码:

SndTp1RcvTp2.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <signal.h>#define N 128
#define SIZE sizeof(struct msgbuf) - sizeof(long)
#define TYPE1 100
#define TYPE2 200struct msgbuf{long mtype;char buf[N];
};int main(){key_t  key;if((key = ftok(".", 'a')) < 0){ // 创建键值 perror("ftok error");return -1;}int msqid;struct msgbuf msg_snd, msg_rcv; // 发送端接收端if((msqid = msgget(key, IPC_CREAT|IPC_EXCL|0664)) < 0){ // 创建消息队列 存在则报错 出现错误返回-1 if(errno != EEXIST){ // 若消息不存在 perror("msgget error");return -1; }else{ // 则消息队列存在 直接打开 msqid = msgget(key, 0664); } } pid_t pid;pid = fork(); // 创建子进程if(pid < 0){perror("fork error");return -1;} else if(pid == 0){ // 若是子进程 while(1){msg_snd.mtype = TYPE1; // 标识信息的符号fgets(msg_snd.buf, N, stdin); // 标准输入 读取用户输入msg_snd.buf[strlen(msg_snd.buf) - 1] = '\0'; // 方便读取msgsnd(msqid, &msg_snd, SIZE, 0); // 消息无法发送则阻塞直到可发送为止 if(strncmp(msg_snd.buf, "quit", 4) == 0){ // 查看用户输入若为quit 则结束父进程 子进程自我结束 kill(getppid(), SIGKILL);break;} } }else{ // 父进程 while(1){msgrcv(msqid, &msg_rcv, SIZE, TYPE2, 0); // 只接收 TYPE2 直到等到有符合条件的消息为止 if(strncmp(msg_rcv.buf, "quit", 4) == 0){kill(pid, SIGKILL);msgctl(msqid, IPC_RMID, NULL); // 删除消息队列 break;}printf("msg_b:%s\n", msg_rcv.buf);}}	return 0;
}

SndTp2RcvTp1.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
#include <signal.h>#define N 128
#define SIZE sizeof(struct msgbuf) - sizeof(long)
#define TYPE1 100
#define TYPE2 200struct msgbuf{long mtype;char buf[N];
};int main(){key_t  key;if((key = ftok(".", 'a')) < 0){ // 创建键值 perror("ftok error");return -1;}int msqid;struct msgbuf msg_snd, msg_rcv; // 发送端接收端if((msqid = msgget(key, IPC_CREAT|IPC_EXCL|0664)) < 0){ // 创建消息队列 存在则报错 出现错误返回-1 if(errno != EEXIST){ // 若消息不存在 perror("msgget error");return -1; }else{ // 则消息队列存在 直接打开 msqid = msgget(key, 0664); } } pid_t pid;pid = fork(); // 创建子进程if(pid < 0){perror("fork error");return -1;} else if(pid == 0){ // 若是子进程  发送方 while(1){msg_snd.mtype = TYPE2; // 标识信息的符号fgets(msg_snd.buf, N, stdin); // 标准输入 读取用户输入msg_snd.buf[strlen(msg_snd.buf) - 1] = '\0'; // 方便读取msgsnd(msqid, &msg_snd, SIZE, 0); // 消息无法发送则阻塞直到可发送为止 if(strncmp(msg_snd.buf, "quit", 4) == 0){ // 查看用户输入若为quit 则结束父进程 子进程自我结束 kill(getppid(), SIGKILL);break;} } }else{ // 父进程  接受方 while(1){msgrcv(msqid, &msg_rcv, SIZE, TYPE1, 0); // 只接收 TYPE1 直到等到有符合条件的消息为止 if(strncmp(msg_rcv.buf, "quit", 4) == 0){kill(pid, SIGKILL);msgctl(msqid, IPC_RMID, NULL); // 删除消息队列 break; }printf("msg_a:%s\n", msg_rcv.buf);}}return 0;
}

俩个程序各开一个子进程,父进程。子进程负责发送信息,父进程负责接收信息,最终能实现在不同终端通讯,发送quit终止通讯

效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/205859.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维知识点-openResty

openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…

2023-简单点-树莓派-camera module 3介绍

Raspberry Pi Camera Module 3 介绍开头先说&#xff0c;注意事项libcamera感光芯片和驱动的兼容图额外&#xff1a;不同module的对应的参数图用bullseye系统测试摄像头预览窗口拍摄静态图片bayer raw图像获取超长曝光视频流raw视频流 ref 介绍 树莓派镜像在Bullseye版本之后&…

linux 讨论题合集(个人复习)

常规文件的权限是什么&#xff1f;如何分配或修改这些权限&#xff1f;文件夹&#xff08;目录&#xff09;的权限是什么&#xff1f;显示常规文件和文件夹的区别 讨论&#xff1a;①常规的文件权限有四种&#xff0c;r可读、w可写、x可执行、-没有权限&#xff1b;②可以使用c…

如何使用录屏软件在电脑录制PDF文件

我有一个PDF文件&#xff0c;想用录屏软件将它录制下来并添加上详细的注释&#xff0c;然后发给客户看&#xff0c;请问应该如何录制呢&#xff1f;有没有推荐的录屏软件呢&#xff1f; 不用担心&#xff0c;本文将会详细的为您讲解如何使用录屏软件在电脑端录制PDF文件&#…

软件测试jmeter基本使用

1安装与配置 1.jdk下载 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#jdk18-windows&#xff08;压缩包中会给&#xff09; 2.jmeter下载 Apache JMeter - Download Apache JMeter&#xff08;压缩包中有&#xff09; 3.操作教学 打开软件后新…

【MySQL数据库】SQL查询语句总结

目录 一、查询数据 1.1 基本查询语句 1.2 表单查询 1.3 WHERE子句 1.3.1 IN关键字查询 1.3.2 Between查询范围 1.3.3 Like匹配查询 1.3.4 AND多条件查询&#xff08;等同于&&&#xff09; 1.3.5 OR多条件查询&#xff08;等同于||&#xff09; 1.3.6 LIMIT子句 1.3.7 对…

【Node.js】笔记整理4 - 版本管理工具nvm

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

【docker】docker安装与优化

目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…

前端:实现二级菜单(点击实现二级菜单展开)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

【Excel】WPS快速按行筛选过滤

用的筛选都是进行列数据过滤&#xff0c;那么遇到一个情况需要行数据过滤查看数据 行过滤 选中行&#xff0c;然后右键菜单&#xff0c;行筛选。 列过滤

7Docker搭建es和kibana

一、安装es 1.拉取镜像 sudo docker pull elasticsearch:7.12.0 elasticsearch:7.12.0:我安装的版本是7.12.0&#xff0c;可以根据实际的情况安装 创建docker容器挂在的目录&#xff1a; sudo mkdir -p /opt/elasticsearch/config sudo mkdir -p /opt/elasticsearch/data s…

使用Python爬取快手视频与评论(App与Web端分析)

文章目录 1. APP端抓包配置2. APP端抓包分析3. Web端抓包分析4. 爬虫代码实现 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a…

13:kotlin类和对象 -- 属性(Properties)

定义属性 类属性可使用var和val定义 class Address {var name: String "Holmes, Sherlock"var street: String "Baker"var city: String "London"var state: String? nullvar zip: String "123456" }属性使用 fun copyAddres…

【虚拟机】Docker基础 【一】

1.1.部署MySQL 首先&#xff0c;我们利用Docker来安装一个MySQL软件&#xff0c;大家可以对比一下之前传统的安装方式&#xff0c;看看哪个效率更高一些。 如果是利用传统方式部署MySQL&#xff0c;大概的步骤有&#xff1a; 搜索并下载MySQL安装包上传至Linux环境编译和配置…

低调使用。推荐一个 GPT4 Turbo、Vision、GPTs、DELL·E3 等所有最新功能同步可用国内网站

在 11 月 6 日&#xff0c;万众期待的 OpenAI DevDay&#xff0c;ChatGPT 发布了一系列新的产品&#xff0c;其中推出了 GPT4 Turbo&#xff0c;并且将GPT4 Vision&#xff0c;DELLE3 等等能力全部集合到一起&#xff0c;不需要再分开使用&#xff0c;原来的局限的文本聊天也进…

php订单发起退款(余额和微信支付)

index.html <a class"btn btn-danger btn-change btn-tuikuan btn-disabled" href"javascript:;"><i class"fa fa-tuikuan"></i> 订单退款</a>-->order.js // 为表格绑定事件Table.api.bindevent(table);//退款按钮…

【经验分享】openGauss 客户端(Data Studio / DBeaver)连接方式

前言 本篇介绍了openGauss常用的客户端连接工具Data Studio和DBeaver 01 客户端工具 openGauss部署之后&#xff0c;在服务器上提供了在命令行下运行的数据库连接工具gsql。此工具除了具备操作数据库的基本功能&#xff0c;还提供了若干高级特性&#xff0c;便于用户使用。…

建设“参与城市”大学--SMU在2023年绿色金融全球论坛上分享观点

2023年11月21日&#xff0c;由新加坡管理大学&#xff08;SMU&#xff0c;简称新大&#xff09;和中国人民大学&#xff08;RUC&#xff0c;简称人大&#xff09;联合主办的“绿色金融与治理&#xff1a;从承诺到行动”全球论坛在北京召开。论坛汇集了来自新加坡、中国及世界各…

【C++高阶(六)】哈希的应用--位图布隆过滤器

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 哈希的应用 1. 前言2. 位图的概念以及定义3. 位…

记一篇Centos7安装innodb_ruby

安装innodb_ruby过程非常坎坷&#xff0c;这里记录下安装过程&#xff0c;有些坑当时没有记录下来&#xff0c;主要把完成安装过程就记录下来 yum安装ruby默认的会安装ruby2.0.0版本&#xff0c;但是在安装innodb_ruby时&#xff0c;会报错&#xff0c;提示至少需要2.4版本以上…