Linux -- 进程间通信、初识匿名管道
目录
进程间通信
什么是进程间通信
进程间通信的一般规律
前言:
管道
代码预准备:
如何创建管道 -- pipe 函数
参数:
返回值:
wait 函数
参数:
验证管道的运行:
源文件 test.c :
makefile 文件:
运行结果:
进程间通信
什么是进程间通信
进程间通信(Inter-Process Communication, IPC)是操作系统中非常重要的一个概念,它指的是不同进程之间进行数据交换或者传递消息的机制。
进程间通信的主要原因和目的是:
资源共享:不同的进程可能需要访问相同的资源或数据,例如文件、数据库等。通过IPC,可以实现对这些共享资源的有效管理和同步访问。
任务协作:在很多情况下,一个复杂的任务可能被分解为多个子任务,由不同的进程来执行。为了完成整个任务,这些进程之间需要相互通信,以协调它们的工作流程。
提高效率:对于一些计算密集型的任务,可以通过将工作分配给多个进程来并行处理,从而加速任务的完成。这时就需要有效的通信机制来保证各部分工作的正确性与一致性。
模块化设计:软件开发时采用模块化的设计思想,即将程序划分为相对独立但又能相互作用的功能单元(即进程)。这样做不仅有利于维护,而且也使得系统更加灵活可扩展。良好的IPC支持能够促进这种架构模式的应用。
跨网络服务调用:随着分布式系统的普及,在不同主机上的进程也需要能够互相通信。这涉及到更高级别的IPC形式,如RPC (Remote Procedure Call) 等技术。
进程间通信的一般规律
让不同的进程看到同一份资源!!!
前言:
假设现在有A、B进程,在A进程中开辟一块空间并写入数据,让 B 进程去 A 进程的这块空间读取数据,虽然确实让不同的进程看到了同一份资源,但是破坏了进程的独立性。
所以进程间通信需要有交换数据的空间,且这块空间不能由通信双方任何一个提供,那么这块空间只能由操作系统提供。
我们回顾一下父子进程,假设父进程对同一个文件分别用读方式和写方式打开,父进程将会得到两个文件描述符对象。
为什么对同一个文件分别用读方式打开和写方式打开,会创建两个文件描述符对象?
当你使用读取模式(例如 open("file.txt", "r")
)和写入模式(例如 open("file.txt", "w")
)分别打开同一个文件时,操作系统会为每次打开操作分配一个独立的文件描述符。这样做有几个原因:
独立性:每个文件描述符代表了对文件的一个独立访问路径。这意味着你可以同时从一个文件描述符读取数据,而从另一个文件描述符写入数据,即使它们指向的是同一个物理文件。这种独立性允许更灵活地处理文件。
位置指针:每个文件描述符都有自己的文件偏移量或位置指针。当你通过不同的文件描述符读写文件时,每个描述符的位置指针可以独立移动。这样,在进行多线程或多进程操作时,各个进程/线程可以安全地在不同位置上工作而不互相干扰。
权限控制:以不同模式打开文件提供了对文件的不同级别的访问权限。比如,只读模式下你只能读取文件内容,而在写入模式下还可以修改文件。拥有两个文件描述符意味着可以根据需要选择适当的访问级别,同时也增加了安全性,因为不需要给所有操作都赋予完全相同的权限。
性能与资源管理:尽管是同一份文件,但根据具体的操作需求(如顺序读取、随机写入等),操作系统可能采取不同的策略来优化I/O性能。此外,维护多个文件描述符也便于系统更好地跟踪哪些程序正在使用该文件,并且有助于实现诸如引用计数这样的机制,从而有效地管理文件相关的系统资源。
总之,虽然这两个文件描述符对应于同一物理文件,但是它们各自保持了自己的状态信息,这使得在同一时间内能够执行更加复杂的并发操作,同时也增强了系统的灵活性和安全性。
父进程得到两个文件描述符对象之后,我们创建子进程,子进程继承父进程的文件描述符表,父子进程指向同一个文件和缓冲区!这也就实现了父子进程看到同一份资源,就可以实现进程间通信!
管道
从前言中就可以看出,管道的本质是文件!
在 Linux 中,管道(pipe)是一种进程间通信(IPC, Inter-Process Communication)的机制,它允许一个进程的输出直接作为另一个进程的输入。
管道可以看作是连接两个或多个命令的数据流通道,它使得数据可以在不同的程序之间流动而不需要通过临时文件。
标准的管道是单向的,即数据只能从写端流向读端。
匿名管道:
在前言中,父进程和子进程的文件的读端和写端都是打开的,为了符合管道是单向的,我们可以选择让 父进程作为写端,子进程作为读端 或者 父进程作为读端、子进程作为写端!
如下图,我们让父进程作为写端,子进程作为读端:
代码预准备:
如何创建管道 -- pipe 函数
#include <unistd.h>int pipe(int pipefd[2]);
该函数用于创建一个匿名管道。
参数:
pipefd
:这是一个指向两个整数的指针。pipe()
成功后,这两个整数会被设置为新创建的管道的读端和写端的文件描述符。读端通常为fd[0]
,写端通常为fd[1]
。
返回值:
- 它在成功时返回 0,并且通过其参数(一个包含两个整数的数组)来传递两个文件描述符;
- 如果调用失败,
pipe()
会返回-1,并设置全局变量errno
来指示具体的错误原因。
wait 函数
#include <sys/types.h>
#include <sys/wait.h>pid_t wait(int *status);
wait()
函数是 Unix 和 Linux 系统中用于进程控制的一个重要函数。它允许一个进程(通常是父进程)等待其子进程结束,并获取子进程的退出状态。wait()
函数会阻塞调用者,直到至少有一个子进程终止或接收到一个信号。
参数:
status
:这是一个指向整数的指针,用来存储子进程的退出状态信息。如果不需要这个信息,可以传递NULL
。
返回值:
- 如果有子进程成功终止,则返回该子进程的 PID;
- 如果没有子进程或者所有子进程都还在运行,
wait()
将一直阻塞,直到至少有一个子进程终止。- 如果发生错误(如被信号中断),则返回-1,并设置
errno
。
验证管道的运行:
源文件 test.c :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>void writer(int wfd)
{const char *str="hello father,I am child";char buffer[128];int cnt=0;pid_t pid=getpid();//获得进程pidwhile(1){//向缓冲区里写入内容snprintf(buffer,sizeof(buffer),"message:%s,pid:%d,count:%d\n",str,pid,cnt);//把缓冲区里的内容写入到管道write(wfd,buffer,sizeof(buffer));cnt++;sleep(1);}
}void reader(int rfd)
{char buffer[128];while(1){//读取管道里的内容ssize_t n=read(rfd,buffer,sizeof(buffer)-1);printf("father get a message: %s",buffer);}
}int main()
{int pipefd[2];int n=pipe(pipefd);if(n<0){return 1;}printf("%d %d\n",pipefd[0],pipefd[1]);pid_t id=fork();if(id==0){//子进程创建成功//关闭读端close(pipefd[0]);writer(pipefd[1]);//写exit(0);}//父进程关闭写端close(pipefd[1]);reader(pipefd[0]);//读wait(NULL);return 0;
}
makefile 文件:
testpipe:test.cgcc -o $@ $^.PHONY:clean
clean:rm -f testpipe
运行结果:
从下面的运行结果可以看出,父进程接收到了子进程写的数据:
相关文章:

Linux -- 进程间通信、初识匿名管道
目录 进程间通信 什么是进程间通信 进程间通信的一般规律 前言: 管道 代码预准备: 如何创建管道 -- pipe 函数 参数: 返回值: wait 函数 参数: 验证管道的运行: 源文件 test.c : m…...

网站的SSL证书快到期了怎么办?怎么续签?
网站的SSL证书即将到期时,需要续签一个新的证书以保持网站的安全性和信任度。以下是续签SSL证书的一般步骤: 1. 选择证书提供商 如果您之前使用的是免费证书,您可以选择继续使用同一提供商的免费证书服务进行续签。如果您需要更高级别的证书…...
解決爬蟲代理連接的方法
爬蟲在運行過程中常常會遇到代理連接的問題,這可能導致數據抓取的效率降低甚至失敗。 常見的代理連接問題 代理IP失效:這是最常見的問題之一。有些代理IP可能在使用一段時間後失效,導致連接失敗。 連接超時:由於網路不穩定或代…...

Prometheus 监控Harbor
你好!今天分享的是基于Prometheus监控harbor服务。 在之前的文章中分别介绍了harbor基于离线安装的高可用汲取设计和部署。那么,如果我们的harbor服务主机或者harbor服务及组件出现异常,我们该如何快速处理呢? Harbor v2.2及以上…...

SQL 干货 | SQL 半连接
大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型,但还有一些连接类型是基于关系代数运算符的,在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型:半连接(Semi …...
洛谷 P1226:【模板】快速幂
【题目来源】https://www.luogu.com.cn/problem/P1226【题目描述】 给你三个整数 a,b,p,求 a^b mod p。【输入格式】 输入只有一行三个整数,分别代表 a,b,p。【输出格式】 输出一行一个字符串 a^b mod ps&a…...
nginx常规操作
Linux下查找Nginx配置文件位置 1、查看Nginx进程 ps -aux | grep nginx 圈出的就是Nginx的二进制文件 2、测试Nginx配置文件 /usr/sbin/nginx -t 可以看到nginx配置文件位置 3、nginx的使用(启动、重启、关闭) 首先利用配置文件启动nginx。 nginx -c /usr/local/nginx/conf…...

Docker镜像不能访问
Get "https://registry-1.docker.io/v2/": dial tcp 192.168.10.194:443: connect: connection refused Idea推送镜像至Harbor私服,报以上错误,Docker镜像地址不能访问,更新Harbor服务器Docker镜像地址,重启Docker服务…...

TCP simultaneous open测试
源代码 /*************************************************************************> File Name: common.h> Author: hsz> Brief:> Created Time: 2024年10月23日 星期三 09时47分51秒**********************************************************************…...
Spring 配置文件动态读取pom.xml中的属性
需求: 配置文件中的 spring.profiles.active${env}需要打包时动态绑定。 一、方案: 在pom.xml文件中配置启用占位符替换 <profiles><!-- 本地开发 --><profile><id>dev</id><properties><env>dev</env>…...

Konva 组,层级
代码: <template><div class"rect"><div class"header"> <!-- <el-button type"primary" click"show">展示</el-button>--> <!-- <el-button type"success&quo…...

vue图片加载失败的图片
1.vue图片加载失败的图片 这个问题发生在测试环境和开发本地,线上环境是可以的,测试环境估计被第三方屏蔽了 2.图片有,却加载不出来 <template v-slot:imageUrlsSlots"{ row }"><div class"flexRow rowCenter"&…...

终止,半成收入来自海外,收入可持续性被质疑
芬尼科技终止原因如下:芬尼科技4年期间经历了两次IPO失败,公司半成收入来自海外,然而公司泳池收入面临欧洲地区冲突冲击及德国新节能措施影响。交易所质疑其收入是否具有可持续性。 作者:Eric 来源:IPO魔女 9月25日&a…...

日常记录,使用springboot,vue2,easyexcel使实现字段的匹配导入
目前的需求是数据库字段固定,而excel的字段不固定,需要实现excel导入到一个数据库内。 首先是前端的字段匹配,显示数据库字段和表头字段 读取表头字段: 我这里实现的是监听器导入,需要新建一个listen类。 读Excel …...

Unable to open nested entry ‘********.jar‘ 问题解决
今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar 为 mysql-connector-java-5.1.27.jar 启动微服务的时候就报错下面的 Exception in thread "main" java.lang.IllegalStateException: Failed to get nested ar…...

反编译华为-研究功耗联网监控日志
摘要 待机功耗中联网目前已知的盲点:App自己都不知道的push类型的被动联网、app下载场景所需时长、组播联网、路由器打醒AP。 竞品 策略 华为 灭屏使用handler定时检测(若灭屏30分钟内则周期1分钟,否则为2分钟),检…...
线程池——Java
一、前言 在字符串常量池中,字符串常量在java程序运行之前就已经创建好了,等程序运行起来后,就可以直接从常量池中拿到字符串并加载到内存中,这样的设计就省下了字符串的构造与销毁的内存开销。 二、优势 操作系统由内核与应用程…...
java 17天 TreeSet以及Collections
SortedSet TreeSet Collections 所有单值集合 1 SortedSet 特点:有序 唯一 实现类:TreeSet 利用TreeSet特有的对数据进行升序,再放到ArryList进行for下标倒序打印,或者利用自身的pollLast()取出最后元…...
JavaScript 第27章:构建工具与自动化
在现代JavaScript开发中,构建工具、代码转换工具、代码质量和代码格式化工具对于提高开发效率、保持代码整洁以及确保代码质量有着至关重要的作用。下面将分别介绍Webpack、Babel、ESLint和Prettier的配置与使用,并给出一些示例。 1. 构建工具ÿ…...
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题 最近手里一台乐视的手机root后, 连接wifi时一直提示网络连接受限,wifi图标显示叹号. 但是不影响正常的网络访问. 解决办法: adb shell settings delete global captive_portal_modeadb shell settings put globa…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...