当前位置: 首页 > news >正文

IO进程线程 day7

 使用消息队列完成两个进程之间相互通信

 

#include<my_head.h>
struct msgbuf
{long mtype;char mtext[128];
};
#define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型2的消息
void *task(void *arg)
{int msgid = *((int *)arg);struct msgbuf buf;while(1){msgrcv(msgid,&buf,SIZE,2,0);printf("收到消息:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit") == 0)break;	}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error");return -1;}//用key值创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}//创建分支线程pthread_t tid = -1;if(pthread_create(&tid,NULL,task,&msgid) != 0){printf("create tid error\n");return -1;}//主线程向消息队列中存放类型1的消息struct msgbuf buf;while(1){printf("请输入消息类型1>>>");scanf("%ld",&buf.mtype);printf("请输入消息正文:");scanf("%s",buf.mtext);msgsnd(msgid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit") == 0)break;	}//删除消息队列if(msgctl(msgid,IPC_RMID,NULL) == -1){perror("msgctl error");return -1;}//阻塞回收分支线程资源pthread_join(tid,NULL);return 0;
}

 

#include<my_head.h>
struct msgbuf
{long mtype;char mtext[128];
};
#define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型1的消息
void *task(void *arg)
{int msgid = *((int *)arg);struct msgbuf buf;while(1){msgrcv(msgid,&buf,SIZE,1,0);printf("收到消息:%s\n",buf.mtext);if(strcmp(buf.mtext,"quit") == 0)break;	}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建key值key_t key = ftok("/",'k');if(key == -1){perror("ftok error");return -1;}//用key值创建消息队列int msgid = msgget(key,IPC_CREAT|0664);if(msgid == -1){perror("msgget error");return -1;}//创建分支线程pthread_t tid = -1;if(pthread_create(&tid,NULL,task,&msgid) != 0){printf("create tid error\n");return -1;}//主线程向消息队列中存放类型2的消息struct msgbuf buf;while(1){printf("请输入消息类型2>>>");scanf("%ld",&buf.mtype);printf("请输入消息正文>>>");scanf("%s",buf.mtext);msgsnd(msgid,&buf,SIZE,0);if(strcmp(buf.mtext,"quit") == 0)break;	}//阻塞回收分支线程资源pthread_join(tid,NULL);return 0;
}

 将信号通信相关代码重新实现一遍

#include<my_head.h>
//信号处理函数
void handler(int signo)
{if(signo == SIGCHLD){waitpid(-1,NULL,WNOHANG);kill(getpid(),SIGKILL);}if(signo == SIGUSR1){printf("逆子,何至于此!!\n");}
}int main(int argc, const char *argv[])
{//创建一个子进程int pid = fork();if(pid > 0){//父进程通过绑定信号函数,将子进程发送的信号捕获后用函数处理if(signal(SIGCHLD,handler) == SIG_ERR){perror("signal error");return -1;}if(signal(SIGUSR1,handler) == SIG_ERR){perror("signal error");return -1;}//父进程在运行中while(1){printf("我真的还想再活500年\n");sleep(1);}}else if(pid == 0){//子进程在运行中,发送一个信号给父进程printf("来来来,喝酒喝酒!!!\n");sleep(5);printf("我已看破红尘,父亲陪我走吧\n");kill(getppid(),SIGUSR1);//子进程退出sleep(2);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}

将共享内存相关代码重新实现一遍

发送端:

#include<my_head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//创建key值int key = ftok("/",'k');if(key == -1){perror("");return -1;}//创建共享内存段int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}//将共享内存段映射到用户空间char *addr = (char *)shmat(shmid,NULL,0);if(addr == (void *)-1){perror("");return -1;}printf("addr = %p\n",addr);//操作共享内存段while(1){fgets(addr,PAGE_SIZE,stdin);addr[strlen(addr)-1] = 0;if(strcmp(addr,"quit") == 0)break;}//取消映射if(shmdt(addr) == -1){perror("shmdt error");return -1;}//删除共享内存if(shmctl(shmid,IPC_RMID,NULL) == -1){perror("shmctl error");return -1;}return 0;
}
#include<my_head.h>
#define PAGE_SIZE 4096int main(int argc, const char *argv[])
{//创建key值int key = ftok("/",'k');if(key == -1){perror("");return -1;}//创建共享内存段int shmid = shmget(key,PAGE_SIZE,IPC_CREAT|0664);if(shmid == -1){perror("shmget error");return -1;}//将共享内存段映射到用户空间char *addr = (char *)shmat(shmid,NULL,0);if(addr == (void *)-1){perror("");return -1;}printf("addr = %p\n",addr);//操作共享内存段while(1){printf("共享内存中的数据为:%s\n",addr);sleep(1);if(strcmp(addr,"quit") == 0)break;}//取消映射if(shmdt(addr) == -1){perror("");return -1;}return 0;
}

相关文章:

IO进程线程 day7

使用消息队列完成两个进程之间相互通信 #include<my_head.h> struct msgbuf {long mtype;char mtext[128]; }; #define SIZE (sizeof(struct msgbuf) - sizeof(long))//分支线程从消息队列中读取类型2的消息 void *task(void *arg) {int msgid *((int *)arg);struct msg…...

扩展学习|数据融合助推商务智能与分析

文献来源&#xff1a;[1]李爱华,续维佳,石勇.基于数据融合的商务智能与分析架构研究[J].计算机科学,2022,49(12):185-194. 一、信息融合 &#xff08;一&#xff09;信息融合定义演变 早期信息融合的定义指出&#xff0c;其主要任务是综合分析若干传感器观测到的信息[9,…...

Java项目:112SSM在线电影订票系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 在线电影订票系统基于SpringSpringMVCMybatis开发&#xff0c;系统分为前台和后台&#xff0c;前台主要用来用户浏览电影信息&#xff0c;订票&#xff0c…...

Echarts——使用graphic组件在一个option内同时设置两个饼图的背景图

使用echarts的graphic原生图形元素组件&#xff0c;为两个饼图设置对应背景。 <template><div id"app"><div class"charts" ref"charts"></div></div> </template><script> import * as echarts from…...

编程笔记 html5cssjs 027 HTML输入属性(1/2)

[TOC](编程笔记 html5&css&js 027 HTML输入属性(1/2)) <input>元素除了type属性表示输入类型&#xff0c;后面还跟上其他属性&#xff0c;叫输入属性。 value 属性 value 属性规定输入字段的初始值&#xff1a; <form action"">First name:<…...

请求参数乱码问题

POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><!-- 设置过滤器中的属性值 -…...

【leetcode】力扣热门之反转链表【简单难度】

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 用例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 输入&#xff1a;head [] 输出&#xff1a;[…...

【sgPasswordInput】自定义组件:带前端校验密码强度的密码输入框,能够提供密码强度颜色提示和文字提示

特性&#xff1a; 有密码强度颜色提示密码强度进度条提示支持设置默认输入提示和密码长度 sgPasswordInput源码 <template><div :class"$options.name" style"width: 100%"><el-inputstyle"width: 100%"ref"psw"type&…...

1599 - Ideal Path (UVA)

题目链接如下&#xff1a; https://onlinejudge.org/index.php?optioncom_onlinejudge&Itemid8&category448&pageshow_problem&problem4474 这道题也是看了刘汝佳的思路才写出来的.... 代码如下&#xff1a; #include <cstdio> #include <deque&…...

计算机网络(超级详细笔记)

使用教材计算机网络&#xff08;第8版&#xff09;&#xff08;谢希仁&#xff09; 第一章&#xff1a;概述 第二章&#xff1a;物理层 第三章&#xff1a;数据链路层 第四章&#xff1a;网络层 第五章&#xff1a;运输层 第六章&#xff1a;应用层 目…...

老杨说运维 | 年末大讲回顾:运维的尽头也是大模型吗?

哈喽~朋友们&#xff0c;这么快又见面啦。前阵子我们给CEO老杨安排了一场年末大讲&#xff0c;主要是跟大家聊聊智能运维的“智”与“能”以及剖析时下热点----运维大模型。后台收到了不少朋友的反馈&#xff0c;小编看了大受鼓舞并暗下决心----新的一年&#xff0c;希望能多安…...

Unity 利用UGUI之Scrollbar制作进度条

在Unity中除了用Slider、Image做进度条&#xff0c;其实用Scrollbar也可以做进度条。 首先&#xff0c;在场景中新建一个Scrollbar组件和一个Text组件&#xff1a; 其次&#xff0c;创建模拟进度的一个脚本&#xff0c;Scrollbar_Progressbar.cs: using System.Collections; …...

MySQL之导入、导出

文章目录 1.navicat导入导出2.mysqldump命令导入导出2.1导出2.2导入 3.load data infile命令导入导出4.远程备份5.思维导图 1.navicat导入导出 使用Navicat工具导入t_log 共耗时 55s 2.mysqldump命令导入导出 2.1导出 导出表数据和表结构 语法&#xff1a; mysqldump -u用…...

【unity小技巧】FPS游戏实现相机的偏移震动、武器射击后退和后坐力效果

最终效果 文章目录 最终效果前言相机偏移震动相机震动脚本换弹节点震动 武器射击后退效果武器后坐力效果完结 前言 关于后坐力之前其实已经分享了一个&#xff1a;FPS游戏后坐力制作思路 但是实现起来比较复杂&#xff0c;如果你只是想要简单的实现&#xff0c;可以看看这个&…...

MINCO+汽车

规划典型的解决方法: 如何准确的描述他的动力学,实际上是对这个物理对象进行建模.(规划等于开环的控制,控制等于闭环的规划),规划系统要做到是假设已知系统模型的情况下去计算一些可能会影响比较好的 未来运动的指令,做未来运动轨迹的推演.对自己建模的情况下还需对环境有个比较…...

大模型机器人发展史:从VoxPoser、RT2到斯坦福Mobile ALOHA、Google机器人

前言 23年7月&#xff0c;我在朋友圈评估Google的RT2说道&#xff1a; “大模型正在革新一切领域啊&#xff0c;超帅&#xff0c;通过大模型不仅能理解“人话”&#xff0c;还能对“人话”进行推理&#xff0c;并转变为机器人能理解的指令&#xff0c;从而分阶段完成任务。回…...

Ubunutu18.04 ROS melodic 无人机 XTDrone PX4 Vins-Fuison 运行配置

一、PX4飞控EKF配置 PX4默认使用的EKF配置为融合GPS的水平位置与气压计高度。如果我们想使用视觉定位&#xff0c;就需要把修改配置文件。让EKF融合来自mavros/vision_pose/pose的数据 1.1修改rcS配置文件 gedit ~/PX4_Firmware/ROMFS/px4fmu_common/init.d-posix/rcS 通过注…...

Linux 常见服务配置

笔记所以内容很多&#xff0c;建议选择性看看 SSH Secure Shell 用于与服务器建立安全的连接 对应服务 sshd 注意&#xff1a;配置文件 配制文件修改需要重启或重载sshd服务才能生效 systemctl sshd reload # 重载 sshd 配置文件 systemctl sshd restart # 重启 ssh…...

Flutter基础

一、关键字 class&#xff1a;用于定义一个新的类&#xff1b; extends: 用于指定一个类继承另一个类&#xff1b; mixin: 用于将一个类的代码片段添加到另一个类中&#xff0c;实现代码复用&#xff1b; abstract: 用于声明一个抽象类或抽象方法&#xff0c;不能直接实例化&a…...

MySQL-数据库概述

数据库相关概念&#xff1a; 数据库(DateBase)简称DB,就是一个存储数据的仓库&#xff0c;数据有组织的进行存储。 数据库分为关系型数据库简称RDBMS和非关系型数据库 关系型数据库简称RDBMS:建立在关系模型的基础上&#xff0c;由多张相互连接的二维表组成的数据库.简单来说…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...