进程间通信(一)

news2025/2/27 8:35:28

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 stdin
	while (fgets(buf, 100, stdin)) {
		len = strlen(buf);
		// write into pipe
		if (write(fds[1], buf, len) != len) {
			perror("write to pipe");
			break;
		}
	       memset(buf, 0x00, sizeof(buf));
		
			 // read from pipe
			 if ((len = read(fds[0], buf, 100)) == -1) {
			 perror("read from pipe");
			 break;
			
		}
		
			 // write to stdout
			if (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;




}

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

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

相关文章

adb的安装

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

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;以最大化…

AOP进阶-02.通知顺序

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

深入探讨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医疗中的探索路径分析

一、引言 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 这里是…

HybridCLR+Adressable+Springboot热更

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

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

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

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

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

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;国内镜…

信息系统的安全防护

文章目录 引言**1. 物理安全****2. 网络安全****3. 数据安全****4. 身份认证与访问控制****5. 应用安全****6. 日志与监控****7. 人员与管理制度****8. 其他安全措施****9. 安全防护框架**引言 从技术、管理和人员三个方面综合考虑,构建多层次、多维度的安全防护体系。 信息…

如何解决svn st中出现!(冲突)的问题

在 SVN&#xff08;Subversion&#xff09;中&#xff0c;svn status 命令用于查看工作副本的状态。当你看到 ! 符号时&#xff0c;通常表示文件或目录在工作副本中丢失&#xff08;missing&#xff09;。以下是解决这个问题的步骤&#xff1a; 1. 理解 ! 的含义 ! 表示该文件…

Redis|复制 REPLICA

文章目录 是什么能干嘛怎么玩案例演示复制原理和工作流程复制的缺点 是什么 官网地址&#xff1a;https://redis.io/docs/management/replication/Redis 复制机制用于将数据从一个主节点&#xff08;Master&#xff09;复制到一个或多个从节点&#xff08;Slave&#xff09;&a…

水利 2月26日练习

测量前准备 使用数字万用表的蜂鸣器档&#xff0c;可以高速检验电解电容器的质量好坏。测量方法如图5-14所示。将数字万用表拨至蜂鸣器档&#xff0c;用两支表笔区分与被测电容器Cx的两个引脚接触&#xff0c;应能听到一阵急促的蜂鸣声&#xff0c;随即声响中止&#xff0c;同时…