linux进程通信



匿名管道

struct_file的两套资源

管道只能单向通信

特征

1.如果管道没有数据 读端在读 默认会直接阻塞正在读取的进程

2.写端写满 在写会阻塞 等待对方读取

管道设计

命名管道

实现管道通信

#pragma once
#include<iostream>
#include<string>
#include<sys/types.h>
#include<sys/stat.h>
#include<cerrno>
#include<cstring>
#include<cassert>
#include<unistd.h>
#include<fcntl.h>using namespace std;
#define NAME_PIPE "/home/ls/lesson24/tmp2"bool createFifo(const string& path){int n=mkfifo(path.c_str(),0777);if(n==0)return true;else{cout<<"errno:"<<errno<<"err string"<<strerror(errno)<<endl;return false;}
}void removeFifo(const string& path){int n=unlink(path.c_str());assert(n==0);(void)n;}#include"comm.hpp"int main(){bool r=createFifo(NAME_PIPE);assert(r);int rfd=open(NAME_PIPE,O_RDONLY);if(rfd<0)exit(0);char buffer[1024];while(true){ssize_t s=read(rfd,buffer,sizeof(buffer));if(s>0){buffer[s]=0;cout<<"client->server#"<<buffer<<endl;}else if(s==0){cout<<"client quit me too"<<endl;break;}else{cout<<"err string:"<<strerror(errno)<<endl;break;}}close(rfd);remove(NAME_PIPE);return 0;
}#include"comm.hpp"using namespace std;
int main(){int wfd=open(NAME_PIPE,O_WRONLY);if(wfd<0)exit(0);char buffer[1024];while(true){cout<<"Please Say#";fgets(buffer,sizeof(buffer),stdin);ssize_t n=write(wfd,buffer,strlen(buffer));assert(n==strlen(buffer));(void)n;}close(wfd);return 0;
}

共享内存

原理

接口的认识

共享内存的优缺点

和管道对比拷贝次数

实现通信

//comm.hpp
#pragma once
#include<sys/ipc.h>
#include<sys/shm.h>
#include<cerrno>
#include<cstring>
#include<iostream>
#include<unistd.h>#define PATHNAME "."
#define PROJ_ID 0x66
#define MAX_SIZE 4096key_t getkey(){key_t k=ftok(PATHNAME,PROJ_ID);if(k<0){std::cerr<<errno<<":"<<strerror(errno)<<std::endl;exit(1);}return k;
}int getShmHelper(key_t k,int flags){int shmid=shmget(k,MAX_SIZE,flags);if(shmid<0){std::cerr<<errno<<":"<<strerror(errno)<<std::endl;exit(2);}return shmid;
}int getShm(key_t k){return getShmHelper(k,IPC_CREAT);
}int createShm(key_t k){return getShmHelper(k,IPC_CREAT|IPC_EXCL|0666);
}void* attachShm(int shmid){void* mem=shmat(shmid,nullptr,0);if((long long)mem==-1){std::cerr<<errno<<":"<<strerror(errno)<<std::endl;exit(3);}return mem;
}void detachShm(void* start){if(shmdt(start)==-1){std::cerr<<errno<<":"<<strerror(errno)<<std::endl;}
}void delShm(int shmid){if(shmctl(shmid,IPC_RMID,nullptr)==-1){std::cerr<<errno<<":"<<strerror(errno)<<std::endl;}
}

//shm_client.cpp
#include<iostream>
#include"comm.hpp"int main(){key_t k=getkey();printf("key:0x%x\n",k);int shmid=getShm(k);printf("shmid:%d\n",shmid);sleep(5);char* start=(char*)attachShm(shmid);  //关联共享内存printf("attch sucess,address start:%p\n",start);const char* message="hello server,我是另一个进程 正在和你通信";pid_t id=getpid();int cnt=1;while(true){sleep(1);snprintf(start,MAX_SIZE,"%s[pid:%d][消息编号:%d]",message,id,cnt++);}detachShm(start);  //去关联sleep(5);return 0;
}

//shm_server.cpp
#include<iostream>
#include"comm.hpp"int main(){key_t k=getkey();printf("key:0x%x\n",k);int shmid=createShm(k);printf("shmid:%d\n",shmid);sleep(5);//关联共享内存char *start=(char*)attachShm(shmid);printf("attch sucess,address start:%p\n",start);//使用while(true){printf("client say:%s\n",start);sleep(1);}//去关联detachShm(start);sleep(10);//删除共享内存delShm(shmid);return 0;
}

消息队列(了解)

信号量

为什么要有信号量

信号

实现kill

#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<cstdio>
#include<cstring>
#include<string>static void Usage(const std::string &proc){std::cout<<"Usage:"<<proc<<"pid signo\n"<<std::endl;
}int main(int argc,char *argv[]){if(argc!=3){Usage(argv[0]);exit(1);}pid_t pid=atoi(argv[1]);int signo=atoi(argv[2]);int n=kill(pid,signo);if(n!=0)perror("kill");while(true){std::cout<<"hello"<<std::endl;sleep(1);}
}

产生信号的方式

除0的理解

软件条件

#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>/* static void Usage(const std::string &proc){std::cout<<"Usage:"<<proc<<"pid signo\n"<<std::endl;
} */
int cnt=0;
void catchSig(int signo){std::cout<<"获取一个信号 信号编号:"<<cnt<<std::endl;exit(1);
}int main(int argc,char *argv[]){signal(SIGALRM,catchSig);alarm(1);while(true){cnt++;}
}

闹钟管理

核心转储

阻塞信号

信号捕捉流程

状态切换

实验

#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<vector>#define MAX_SIGNUM 31
#define BLOCK_SIGNAL 2static std::vector<int> sigarr={2,3};static void show_pending(const sigset_t &pending){for(int signo=MAX_SIGNUM;signo>0;signo--){if(sigismember(&pending,signo)){std::cout<<"1";}elsestd::cout<<"0";}std::cout<<"\n";
}static void myhandler(int signo){std::cout<<signo<<"号信号已经被递达"<<std::endl;
}int main(){for(const auto &sig:sigarr){signal(sig,myhandler);}sigset_t block,oblock,pending;//初始化sigemptyset(&block);sigemptyset(&oblock);sigemptyset(&pending);//增加要屏蔽的信号for(const auto &sig:sigarr){sigaddset(&block,sig);}//开始屏蔽 设置进内核(进程)sigprocmask(SIG_SETMASK,&block,&oblock);//遍历打印pending信号集while(true){//初始化sigemptyset(&pending);//获取它sigpending(&pending);//打印show_pending(pending);sleep(1);}int cnt=10;if(cnt--==0){sigprocmask(SIG_SETMASK,&oblock,&block);std::cout<<"恢复信号屏蔽\n";}}

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

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

相关文章

windows MYSQL解决中文乱码问题

1.首先确保你已经把mysql配置了环境变量 2.打开window终端 3.输入mysql -u root -p 4.输入密码&#xff0c;就是安装的时候设置的root超级管理员权限密码 5.输入&#xff1a; SHOW VARIABLES LIKE ‘character%’; 出现上图&#xff0c;说明就会出现中文乱码问题。 6.该怎么办…

redis-学习笔记(hash)

Redis 自身已经是 键值对 结构了 Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成后, 到了 value 这一层, 还可以用 哈希类型 来组织 (简单的说就是哈希里面套哈希 [数组里面套数组 -> 二维数组] ) [ field value ] hset key field value [ field va…

【Java 基础】23 国际化

文章目录 1.概念2.原理1&#xff09;Locale2&#xff09;ResourceBundle3&#xff09;MessageFormat 3.例子1&#xff09;准备资源文件2&#xff09;加载资源文件3&#xff09;格式化消息&#xff08;非必须&#xff09; 总结 在全球化的今天&#xff0c;开发支持多语言的应用变…

STM32F1的TIM输出比较(PWM)

目录 1. OC&#xff08;Output Compare&#xff09;输出比较 2. PWM简介 3. 输出比较通道(高级) 4. 输出比较通道(通用) 5. PWM基本结构 6. 配置介绍 6.1 输出比较模块配置 6.2 给输出比较结构体赋一个默认值 6.3 配置强制输出模式 6.4 配置CRR寄存器的预装…

【文件上传系列】No.1 大文件分片、进度图展示(原生前端 + Node 后端 Koa)

分片&#xff08;500MB&#xff09;进度效果展示 效果展示&#xff0c;一个分片是 500MB 的 分片&#xff08;10MB&#xff09;进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页…

低代码与MES:智能制造的新篇章

一、引言 随着工业4.0和智能制造的兴起&#xff0c;企业对于生产过程的数字化、智能化需求日益迫切。制造执行系统&#xff08;MES&#xff09;作为连接计划层与控制层的关键信息系统&#xff0c;在提升生产效率、优化资源配置、保障产品质量等方面发挥着重要作用。然而&#…

AIGC实战——WGAN(Wasserstein GAN)

AIGC实战——WGAN 0. 前言1. WGAN-GP1.1 Wasserstein 损失1.2 Lipschitz 约束1.3 强制 Lipschitz 约束1.4 梯度惩罚损失1.5 训练 WGAN-GP 2. GAN 与 WGAN-GP 的关键区别3. WGAN-GP 模型分析小结系列链接 0. 前言 原始的生成对抗网络 (Generative Adversarial Network, GAN) 在…

深入探索C语言中的二叉树:数据结构之旅

引言 在计算机科学领域&#xff0c;数据结构是基础中的基础。在众多数据结构中&#xff0c;二叉树因其在各种操作中的高效性而脱颖而出。二叉树是一种特殊的树形结构&#xff0c;每个节点最多有两个子节点&#xff1a;左子节点和右子节点。这种结构使得搜索、插入、删除等操作…

【React Hooks】useReducer()

useReducer 的三个参数是可选的&#xff0c;默认就是initialState&#xff0c;如果在调用的时候传递第三个参数那么他就会改变为你传递的参数&#xff0c;实际开发不建议这样写。会增加代码的不可读性。 使用方法&#xff1a; 必须将 useReducer 的第一个参数&#xff08;函数…

MySQL - 并发控制与事务的隔离级别

目录 第1关&#xff1a;并发控制与事务的隔离级别 第2关&#xff1a;读脏 第3关&#xff1a;不可重复读 第4关&#xff1a;幻读 第5关&#xff1a;主动加锁保证可重复读 第6关&#xff1a;可串行化 第1关&#xff1a;并发控制与事务的隔离级别 任务描述 本关任务&#…

linux初级学习

(420条消息) 红帽认证-RHCSA_rhcsa红帽认证_yyyzf的博客-CSDN博客 OS&#xff1a;用户和机器的接口&#xff0c;UI:CMD,GUI shell: 通用格式 命令 选项&#xff08;调控功能&#xff09; 参数&#xff08;操作对象&#xff09;参数 省略参数对象一般使用当前目录作为参数对…

vue3日常知识点学习归纳

1&#xff0c;父子组件传递&#xff1a; 父组件传递参数 <template><div><!-- 子组件 参数&#xff1a;num 、nums --><child :num"nums.num" :doubleNum"nums.doubleNum" increase"handleIncrease"></child>&l…

JAVA全栈开发 day19_JDBC

一、JDBC 1.JDBC概述 1.1什么是jdbc Java DataBase Connectivity是一种用于执行SQL语句的Java API&#xff0c;它由一组用Java语言编写的类和接口组成。通过这些类和接口&#xff0c;JDBC把SQL语句发送给不同类型的数据库进行处理并接收处理结果。 1.2jdbc的作用 提供java…

【目标检测从零开始】torch搭建yolov3模型

用torch从0简单实现一个的yolov3模型&#xff0c;主要分为Backbone、Neck、Head三部分 目录 Backbone&#xff1a;DarkNet53结构简介代码实现Step1&#xff1a;导入相关库Step2&#xff1a;搭建基本的Conv-BN-LeakyReLUStep3&#xff1a;组成残差连接块Step4&#xff1a;搭建Da…

思维模型 色彩心理效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知色彩影响情绪。 1 色彩心理效应的应用 1.1 色彩心理效应在营销中的应用 1 可口可乐公司的“红色”营销 可口可乐公司是全球最著名的饮料品牌之一&#xff0c;其标志性的红色包装已经成为了…

Constraining Async Clock Domain Crossing

Constraining Async Clock Domain Crossing 我们在normal STA中只会去check 同步clock之间的timing,但是design中往往会存在很多CDC paths,这些paths需要被正确约束才能保证design function正确,那么怎么去约束这些CDC paths呢? 以下面的design为例,如下图所示 这里clk…

小红书蒲公英平台开通后,有哪些注意的地方,以及如何进行报价?

今天来给大家聊聊当小红书账号过1000粉后&#xff0c;开通蒲公英需要注意的事项。 蒲公英平台是小红书APP中的一个专为内容创作者设计的平台。它为品牌和创作者提供了一个完整的服务流程&#xff0c;包括内容的创作、推广、互动以及转换等多个方面。 2.蒲公英平台的主要功能 &…

【C语言】vfprintf函数

vfprintf 是 C 语言中的一个函数&#xff0c;它是 fprintf 函数的变体&#xff0c;用于格式化输出到文件中。vfprintf 函数接受一个格式化字符串和一个指向可变参数列表的指针&#xff0c;这个列表通常是通过 va_list 类型来传递的。vfprintf 函数的主要用途是在需要处理不定数…

远传智能水表一般应用于哪些场景?

远传智能水表是一种在水表领域应用广泛的创新技术&#xff0c;它利用物联网和无线通信技术使水表具备了远程监测和数据传输的能力。这种智能水表的应用场景多种多样&#xff0c;可适用于各个领域和环境。那么&#xff0c;远传智能水表一般应用于哪些场景呢&#xff1f; 首先&am…

9.关于Java的程序设计-基于Springboot的家政平台管理系统设计与实现

摘要 随着社会的进步和生活水平的提高&#xff0c;家政服务作为一种重要的生活服务方式逐渐受到人们的关注。本研究基于Spring Boot框架&#xff0c;设计并实现了一种家政平台管理系统&#xff0c;旨在提供一个便捷高效的家政服务管理解决方案。系统涵盖了用户注册登录、家政服…