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

进程间通信(一)

1.进程间通信介绍

数组传输:一个进程需要将它的数据发送给另一个进程

资源共享:多个进程之间共享同样的资源

通知事件:一个进程需要向另一个或者一组进程发送信息,通知发送了某种事件(如进程终止时要通知父进程)

进程控制:有写进程要完全控制另一个进程的执行(如debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

进程间通信发展

管道

System V进程间通信

POSIX进程间通信

进程间通信分类

管道

匿名管道pipe

命名管道

Symtem V IPC

Symtem V 消息队列

Symtem V 共享内存

Symtem V 信号量

POSIX IPC

消息队列

共享内存

信号量

互斥量

条件变量

读写锁

2.管道

什么是管道

管道是Unix中最古老的进程间通信的形式

把从一个进程连接到另一个进程得到一个数据流称为一个“管道”

匿名管道

#include<unistd.h>
//功能:创建一个无名管道
//原型
int pipe(int fd[2]);
//参数
//fd:文件描述符数组,其中fd[0]表示读端,fd[1]表示写端
//返回值:成功返回0,失败返回错误代码

 

示例代码

fds[2]:用来存储管道的俩个文件描述符。fds[0]是读端,fds[1]是写端。

fgets:从标准键盘读取最多99个字符(加上/0),存储到buf中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{int fds[2];char buf[100];int len;if (pipe(fds) == -1)perror("make pipe"), exit(1);// read from stdinwhile (fgets(buf, 100, stdin)) {len = strlen(buf);// write into pipeif (write(fds[1], buf, len) != len) {perror("write to pipe");break;}memset(buf, 0x00, sizeof(buf));// read from pipeif ((len = read(fds[0], buf, 100)) == -1) {perror("read from pipe");break;}// write to stdoutif (write(1, buf, len) != len) {perror("write to stdout");break;}}}

3.用fork来共享管道原理

子进程可以继承父进程,但是仅限于内存级别,管道文件是不会继承的,但之所以共享是,进程地址里结构体有指针指向这个文件,而这个指针是可以被继承的,也就是说子进程也会有指针指向这个管道文件,然后匿名管道是单向的,父进程输入子进程接受,子进程输入父进程接受,读端和写端只能开一个。

 深度理解管道

父子进程共享的文件描述表,对于读端和写端,若是父子进程有一个挂掉了,对应的资源也不会释放,因为是共享的,所以会有计数拷贝,只有计数为0才会释放资源,然后inode和ops以及缓冲区是不会继承的,因为这是文件的,不属于内存。

 进程通信的前提条件是让不同的进程,先看到同一份资源(内存),因为父子进程有继承的关系,就可以共享文件描述表,这样就可以有同一份资源了,都指向同一个文件,通过文件来进行通信,实现匿名管道通信,比如父进程通知子进程,就把父进程的对应读端文件描述符关闭,然后子进程的对应写端文件描述关闭。

 

站在内核角度-管道本质

数据页:是管道中实际存储数据的部分。它是一个缓冲区,用于暂存一个进程流向另一个进程的数据。

管道工作的原理

管道写操作(write):当进程1先管道写数据时,数据首先被写入进程1的文件结构中的private_data部分,然后被传到inode,表示管道的当前状态。最后,数据被写入数据页,等待被另一个进程读取。

管道读操作(read):

当进程2从管道读取数据时,数据首先从数据页中读取。然后,数据被传送到进程2的文件结构中的private_data部分。最后,数据被进程2处理或进一步传递。

俩个操作之间的连接,通过内核中的inode和数据页,实际上就代表了管道。管道可以被认为是内核中用于连接一个进程的写操作和一个或多个进程的读操作的缓冲区。

图中并没有直接画出管道对象本身,但是通过进程1和进程2的文件结构以及它们与内核交互的方式,展示了管道操作的本质。管道在这里是抽象的概念,指的是进程间通过文件描述符和内核文件系统进行通信的机制。

 

4.管道样例

 

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>int main(int argc,char* argv[])
{int pipefd[2];if(pipe(pipefd)==-1){perror("pipe error");exit(-1);}pid_t pid;pid=fork();if(pid==-1)perror("fork fail");if(pid==0){close(pipefd[0]);write(pipefd[1],"hello",5);close(pipefd[1]);close(pipefd[1]);exit(0);}close(pipefd[1]);char buf[10]={0};read(pipefd[0],buf,10);printf("buf=%s\n",buf);return 0;}

相关文章:

进程间通信(一)

1.进程间通信介绍 数组传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源 通知事件&#xff1a;一个进程需要向另一个或者一组进程发送信息&#xff0c;通知发送了某种事件(如进程终止时要通知父进程) 进程控制&…...

人工智能中的特征是什么?

什么是人工智能中的特征&#xff1f; 在人工智能中&#xff0c;特征&#xff08;feature&#xff09;是指从原始数据中提取出的、能够代表数据关键信息并用于模型训练的属性或变量。特征通常是对原始数据的抽象或转换&#xff0c;目的是捕捉数据中的模式、结构或相关性&#x…...

MongoDB私人学习笔记

俗话说“好记性不如烂笔头”&#xff0c;编程的海洋如此的浩大&#xff0c;养成做笔记的习惯是成功的一步&#xff01; 此笔记主要是ZooKeeper3.4.9版本的笔记&#xff0c;并且笔记都是博主自己一字一字编写和记录&#xff0c;有错误的地方欢迎大家指正。 一、基础知识&#xf…...

大数据SQL调优专题——调优切入

引入 我们都知道大数据的SQL优化&#xff0c;并非一蹴而就的简单任务&#xff0c;而是一个涉及多个环节的复杂过程。从需求提出到最终交付&#xff0c;任何一个环节的微小偏差都可能影响最终成果。 虽然我们的专栏名字叫大数据SQL调优&#xff0c;但是实际调优并不是简单对SQ…...

Idea java项目结构介绍

一般来说&#xff0c;一个典型的 IntelliJ IDEA Java 项目具有特定的结构&#xff0c;以下是对其主要部分的介绍&#xff1a; 项目根目录 项目的最顶层目录&#xff0c;包含了整个项目的所有文件和文件夹&#xff0c;通常以项目名称命名。在这个目录下可以找到.idea文件夹、.g…...

adb的安装

1、概念 &#xff08;1&#xff09;adb&#xff08;android debug bridge&#xff09;安卓调试桥&#xff0c;用于完成电脑和手机之间的通信控制。 &#xff08;2&#xff09;xcode来完成对于ios设备的操控&#xff0c;前提是有个mac电脑。 2、adb的安装 &#xff08;1&…...

React + TypeScript 数据模型驱动数据字典生成示例

React TypeScript 数据模型驱动数据字典生成示例 引言&#xff1a;数据字典的工程价值 在现代化全栈开发中&#xff0c;数据字典作为业务实体与数据存储的映射桥梁&#xff0c;直接影响系统可维护性与团队协作效率。传统手动维护字典的方式存在同步成本高和版本管理混乱两大痛…...

Nginx 平滑升级/回滚

平滑升级和回滚的前提条件是 nginx 已经安装好&#xff0c;源码安装 nginx 可参考上一篇文章。在上一篇文章的基础上&#xff0c;nginx 已安装好且已启动&#xff0c;目前是 1.24 版本。 一、平滑升级 Nginx 的平滑升级&#xff08;热升级&#xff09;是一种 不中断服务 即可更…...

强化学习演进:GRPO 从何而来

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是机器学习的一个分支&#xff0c;其核心是让智能体&#xff08;Agent&#xff09;通过与环境&#xff08;Environment&#xff09;的交互&#xff0c;学习如何采取最优行动&#xff08;Action&#xff09;以最大化…...

Uniapp 小程序复制、粘贴功能实现

在开发 Uniapp 小程序的过程中&#xff0c;复制和粘贴功能是非常实用且常见的交互需求。今天&#xff0c;我就来和大家详细分享如何在 Uniapp 中实现这两个功能。 复制功能&#xff1a;uni.setClipboardData方法 goResult() {uni.setClipboardData({data: this.copyContent, /…...

AOP进阶-02.通知顺序

一.通知顺序 当有多个切面类中的切入点表达式一样时&#xff0c;这些切面类的执行顺序是怎样的呢&#xff1f;如图我们将定义两个切面类&#xff0c;一个MyAspect2&#xff0c;一个MyAspect3&#xff0c;一个MyAspect4。执行后我们发现&#xff0c; 对于目标方法前的通知方法&…...

Node.js 中 fs 模块的高级用法

目录 1. 流式文件处理 示例&#xff1a;大文件复制 2. 文件监控 示例&#xff1a;使用 fs.watch 监控文件变化 3. 异步递归操作 示例&#xff1a;异步递归遍历目录 4. 文件权限管理 示例&#xff1a;修改文件权限 5. 原子操作 示例&#xff1a;原子重命名文件 在 Nod…...

深入探讨K8s资源管理和性能优化

#作者&#xff1a;曹付江 文章目录 前言&#xff1a;1&#xff0e;监控 Kubernetes 集群的资源利用率1.1 Prometheus1.2 Kubernetes 度量服务器1.3 Grafana1.4 自定义指标 2. 识别资源瓶颈2.1. 监控工具2.2. 性能剖析2.3 Kubernetes 事件和日志2.4. 群集自动扩展2.5. 负载测试…...

Buildroot 添加自定义模块-内置文件到文件系统

目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统&#xff0c;适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…...

对话式AI引擎:DeepSeek技术引领多模态交互新篇章

摘要 DeepSeek技术公司推出了一项创新服务——“对话式AI引擎”&#xff0c;仅需两行代码即可激活任意大型AI模型的语音对话功能。这项技术使得文本型AI模型迅速转变为具备实时语音对话能力的多模态交互模型&#xff0c;解决了大型AI模型在语音交互方面的不足&#xff0c;为AI行…...

形式化数学编程在AI医疗中的探索路径分析

一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…...

HTML——前端基础1

目录 前端概述 前端能做的事情​编辑 两步完成一个网页程序 前端工具的选择与安装 HTML HTML5介绍 HTML5的DOCTYPE声明 HTML基本骨架 文字标签 标题之标签 标签之段落、换行、水平线 标签之图片 标签之超文本链接 标签之文本 列表标签之有序列表 列表标签之无序…...

Blueprint —— Events

目录 一&#xff0c;Event Level Reset 二&#xff0c;Event Actor Begin Overlap 三&#xff0c;Event Actor End Overlap 四&#xff0c;Event Hit 五&#xff0c;Event Any Damage 六&#xff0c;Event Point Damage 七&#xff0c;Event Radial Damage 八&#xff…...

Java一揽子集合整理

Java 集合框架 List ArrayList&#xff0c;底层Object数组&#xff0c;相关方法add&#xff0c;remove Vector&#xff0c;底层Object数组&#xff0c;线程安全&#xff0c;使用 synchronized 关键字进行同步处理 Stack&#xff0c;继承自Vector&#xff0c;是一个后进先出的…...

第二十四:5.2【搭建 pinia 环境】axios 异步调用数据

第一步安装&#xff1a;npm install pinia 第二步&#xff1a;操作src/main.ts 改变里面的值的信息&#xff1a; <div class"count"><h2>当前求和为&#xff1a;{{ sum }}</h2><select v-model.number"n">  // .number 这里是…...

dubbo转http方式调用

业务背景&#xff1a;在当前项目下&#xff0c;所有前端请求均通过外层网关转发到后端这边的dubbo服务&#xff0c;现计划去掉网关层&#xff0c;由前端直接http调用后端dubbo。 解决方案&#xff1a;在前端调用方式不变的前提下&#xff0c;后端服务新建controller层&#xf…...

HybridCLR+Adressable+Springboot热更

本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易&#xff0c;动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目&#xff1a; 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…...

金融行业专题|某基金公司基于超融合信创平台支持人大金仓数据库的性能评测

随着“自主可控”在 IT 基础设施领域不断深化&#xff0c;数据库的国产化替代也被很多金融机构提上日程。为了保证性能&#xff0c;大部分国产数据库都基于信创架构的裸金属服务器部署。在国产虚拟化/超融合平台上&#xff0c;国产数据库性能表现如何&#xff1f;尤其是搭配信创…...

父组件用的是原生监听,子组件用的是onClick,子组件添加了stopPropagation还是没有阻止传播

父组件用事件监听&#xff0c;子组件用onClick&#xff0c;即使子组件加了stopPropagation还是没有阻止冒泡。父组件可能使用原生的addEventListener来绑定事件&#xff0c;而子组件用的是React的onClick事件。这时候&#xff0c;虽然子组件调用了e.stopPropagation()&#xff…...

【问题解决方案】随笔 - vscode里面出现双环境解决方案

1.问题重述 (.venv) (base) 2.解决方案 看是conda还是venv环境&#xff0c;先给退出了 1.conda 比如Anaconda 的 (base) 环境&#xff0c;使用 conda deactivate2.venv deactivate然后重新激活环境即可 END...

什么是 Java 中的线程安全?

回答 Java 中的线程安全&#xff08;Thread Safety&#xff09;指的是在多线程环境下&#xff0c;当多个线程同时访问和操作共享资源&#xff08;如对象、变量、数据结构等&#xff09;时&#xff0c;能够保证程序的正确性&#xff0c;不会出现数据不一致、竞争条件&#xff0…...

【2025全网最新最全】前端Vue3框架的搭建及工程目录详解

文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/ 安装完成后&#xff0c;打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…...

大白话JavaScript闭包在实际项目中有哪些应用场景?

大白话JavaScript闭包在实际项目中有哪些应用场景&#xff1f; 闭包是指有权访问另一个函数作用域中的变量的函数。在实际项目中&#xff0c;闭包有很多应用场景&#xff0c;以下是一些常见的例子&#xff1a; 数据封装和隐私保护 场景&#xff1a;在开发中&#xff0c;有时…...

R 语言科研绘图第 27 期 --- 密度图-分组

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

QT各种版本下载安装

参考链接&#xff1a; 【Qt】超详细&#xff01;Qt4.8.6和VS2010的配置及使用 由于QT官网一般现在进不去&#xff0c;所以下载一些QT版本只能通过镜像或者以前下载存储的安装包来进行&#xff0c;现在推荐两种方法 从参考链接中搬过来&#xff1a; 方案一&#xff1a;国内镜…...