【Linux系统】理解进程间通信

【OpenClaw从入门到精通】第63篇:A股智能分析实战——用OpenClaw搭建个人量化研究助手(2026实测版) 2026年,OpenClaw已成为量化投研圈的现象级工具,八家头部券商密集发布专题研报力证其价值。传统量化投研面临技术门槛高、重复劳动多、策略迭代慢、非结构化数据处理弱四大痛点,而OpenClaw通过“AI智能体+金融Skill+量化API”的融合,实现了从数据获取、策略生成、回测验证到持仓监控的全流程自动化。本文基于2026年最新实测经验,完整呈现个人量化研究助手搭建:从阿里云部署、阿里云百炼API配置(含解析失败解决方案)、Tushare数据源接入,到PB-ROE价值选股、研报复现、自动化回测、持仓监控 阅读详情

1.理解层面

1.1为什么要进程间通信??

  • 数据传输:一个进程需要将它的数据发送给另一个进程
  • 资源共享:多个进程之间共享同样的资源
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知它发生了某种事情(如进程终止时要通知父进程)
  • 进程控制:有些进程希望完全控制另一个进程的执行(Debug进程)

1.2什么是通信??

进程间通信是指在计算机系统中,运行在不同进程之间的数据交换和通信机制。由于每个进程都有自己的独立内存空间,因此进程间通信需要通过特定的机制来实现数据的共享和传递

1.3怎么通信??

进程间通信的本质:是先让不同的进程,先看到同一份资源[“内存”]

1.4 具体通信的方式??

  • 基于文件的,管道通信
    • 匿名管道pipe
    • 命名管道
  • System V ,本机通信
    • System V 消息队列
    • System V 共享内存
    • System V 信号量

2.管道

什么是管道??

  • 管道是Unix中最古老的进程间通信的形式
  • 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
    在这里插入图片描述

3.匿名管道

#include<unistd.h>
int pipe(int pipefd[2]);
参数:
	pipefd:文件描述符数组,其中pipefd[0]表示读端,pipefd[1]表示写端
	返回值:成功返回0,失败返回-1
//列子:查看pipefd对应的文件描述符
//testPipe.cc

#include <iostream>
#include <unistd.h>

int main()
{
    //1.创建管道
    int pipefd[2]={0};//pipefd[0] 读端  pipefd[1] 写端
    int n=pipe(pipefd);
    if(n<0)
    {
        perror("pipe fail");
        exit(1);
    }

    std::cout<<"pipefd[0]: "<<pipefd[0]<<std::endl;
    std::cout<<"pipefd[1]: "<<pipefd[1]<<std::endl;
}

//运行结果:
$ ./testPipe
pipefd[0]: 3
pipefd[1]: 4

3.1 用fork来共享管道

在这里插入图片描述

//测试样例:测试管道的读写
//让父进程读,子进程写
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
#include <cstring>

void ChildWrite(int wfd)
{
    char buff[1024];
    int cnt=0;
    while(true)
    {
        snprintf(buff,sizeof(buff),"I am child,my pid:%d,cnt: %d\n",getpid(),cnt++);
        write(wfd,buff,strlen(buff));
        sleep(1);
    }
}
void FatherRead(int rfd)
{
    char buff[1024];
    while(true)
    {
        buff[0]=0;
        ssize_t n=read(rfd,buff,sizeof(buff)-1);
        if(n>0)
        {
            buff[n]=0;
            std::cout<<"father say: "<<buff<<std::endl;
        }
        sleep(1);
    }
}

int main()
{
    // 1.创建管道
    int pipefd[2] = {0}; // pipefd[0] 读端  pipefd[1] 写端
    int n = pipe(pipefd);
    if (n < 0)
    {
        perror("pipe fail");
        exit(1);
    }

    std::cout << "pipefd[0]: " << pipefd[0] << std::endl;
    std::cout << "pipefd[1]: " << pipefd[1] << std::endl;

    // 2.创建子进程
    pid_t id =fork();
    if(id<0)
    {
        perror("fork fail");
        exit(1);
    }
    else if(id==0)
    {
        //child
        //3.关闭不需要的读端,形成通信
        close(pipefd[0]);
        ChildWrite(pipefd[1]);
        close(pipefd[1]);
        exit(0);
    }
    else
    {
        //father
        //3.关闭不需要的写端,形成通信
        close(pipefd[1]);
        FatherRead(pipefd[0]);
        close(pipefd[0]);
    }
}

//查看运行结果:
$ ./testPipe
pipefd[0]: 3
pipefd[1]: 4
father say: I am child,my pid:1670938,cnt: 0

father say: I am child,my pid:1670938,cnt: 1

father say: I am child,my pid:1670938,cnt: 2

father say: I am child,my pid:1670938,cnt: 3

father say: I am child,my pid:1670938,cnt: 4

father say: I am child,my pid:1670938,cnt: 5
...

3.2 特性

  • 匿名管道,只能用来进行具有血缘关系的进程进行进程间通信(常用于父子)
  • 管道文件,自带同步机制
  • 管道是单向通信的
  • (管道)文件的生命周期,是随进程的
  • 管道是面向字节流的,意味着数据以字节为单位字管道中传输

3.3 通信情况

  • 写慢,读快 —读端就要阻塞(进程)

  • 写快,读慢 —满了的时候,写就要阻塞等待
    在这里插入图片描述

  • 写关,继续读 —read就会读到返回值为0,表示文件结尾

  • 读关闭,写继续 —写端在写入没有任何意义,OS会杀掉写端进程,发送异常信号

4.命名管道

  • 让2个不相关的进程之间交换数据,可以使用FIFO文件来做这个工作,它叫做命名管道
  • 命名管道是一种特殊类型的文件

4.1 创建一个命名管道

# 从命令行上创建
$ mkfifo filename

#从程序里创建
int mkfifo(const char *pathname, mode_t mode);

4.2 匿名管道和命名管道的区别

  • 匿名管道由pipe函数创建并打开
  • 命名管道由mkfifo函数创建,open打开
  • 匿名管道只能在具有血缘关系的进程里进行进程间通信
  • 命名管道可以用来进行不相关的进程的进程间通信

5.System V 共享内存

  • 共享内存是进程间通信中,速度最快的方式(优点):
    • 映射之后,读写,直接被对方看到
    • 不需要进行系统调用获取或者写入
  • 共享内存没有保护机制(缺点):
    • 通信双方,没有所谓的“同步机制”
    • 数据不一致
      在这里插入图片描述

5.1 共享内存函数

  • shmget函数
功能:用来创建共享内存
原型:
	int shmget(key_t key, size_t size, int shmflg);
参数:
	key:这个共享内存段名字
	size:共享内存大小
	shmflg:权限标志
		取值IPC_CREAT:共享内存不存在,创建并返回;共享内存已存在,获取并返回
		取值IPC_CREAT|IPC_EXCL:共享内存不存在,创建并返回;共享内存已存在,出错返回
返回值:
	成功返回一个非负整数,即共享内存标识码;失败返回-1
  • shmat函数
功能:将共享内存段连接到进程地址空间
原型:
	void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
	shmid:共享内存标识
	shmaddr:虚拟地址,固定地址进行挂接
	shmflg:它的2个可能取值是SHM_RND和SHM_RDONLY
返回值:
	成功返回起始的虚拟地址;失败返回-1
  • shmdt函数
功能:将共享内存段与当前进程脱离
原型:
	int shmdt(const void *shmaddr);
参数:
	shmaddr:由shmat所返回的指针
返回值:
	 成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段
  • shmctl函数
功能:用于控制共享内存
原型: 	
	int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
	shmid:由shmget返回的共享内存标识码
	cmd:要采用的行动
	buf:指向一个保存着共享内存模式状态和访问权限的数据结构
返回值:
	成功返回0;失败返回-1
命令(cmd)说明
IPC_STAT把shmid_ds结构中的数据设置为共享内存的当前关联值
IPC_SET在进程有足够权限的前提下,把共享内存的当前关联值设置成shmid_ds数据结构中给出的值
IPC_RMID删除共享内存段
新版ThingsBoard 4.2.0在windows上用IDEA编译记录 编译thingsboard4.2.0在windows上使用Idea 阅读详情

相关推荐

Sinutrain下载安装与开启OPC UA---kalrry

Sinutrain 开启 OPC UA 本教程只适用于版本,其他版本配置目录有所改变建议安装到默认路径,否则后期修改路径时候容易忽略细节本教程提供安装包为官方包,网上有些非官方包安装后容易出现授权问题,比如授权管理器无法启动,官方技术会建议你重装系统,很多时候是因为安装包非官方包在首次安装前,建议重启一遍系统。

kalrry 1万+

【Linux系统】理解Linux中进程间通信

Linux进程间通信

fufufu_的博客 3045

【gridsample】地平线征程6芯片中gridsample算子的优化与部署实践

本文详细介绍了地平线征程6芯片中gridsample算子的优化与部署实践,重点探讨了PTQ和QAT量化方案在BEV感知任务中的应用。通过双线性插值优化、内存布局调整和混合精度配置等关键技术,显著提升了算子在自动驾驶场景下的性能和精度,为开发者提供了实用的部署指南和调优建议。

zero1的博客 1019

【Linux系统】进程间通信:初识IPC与理解匿名管道

本文主要讲解:1、初识进程(概念/类型/原理);2、匿名管道(概念 / 重定向 / 使用 / 具体代码演示 / 管道的四种情况 / 匿名管道五大特性);

从不依靠,从不寻找,非常沉默,非常骄傲。 你必须非常努力,才能看起来毫不费力。 897

三维(点云)语义分割概述以及方法总结

语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到...

renhaofan的博客 3万+

S4 Hana SD -信贷管理 - 02

在S4版本中,客户的信用管理数据在事务代码BP维护,业务伙伴角色是UKM000。在维护过程中,我们并不能直接输入信贷控制范围这个组织架构,而是需要输入一个信用段,并且在信用段的维度下去维护相应信用管理数据。对于信用段,可以分为主信用段(信用段是0000)和其他临时信用段,我们可以通过配置把次级信用段的客户信贷负债汇总到主信用段。当然,在后台也有配置,会把信用段和信贷控制范围这两者进行关联.3.2SPROIMG > 财务供应链管理 > 信用管理 > 信贷风险监视 > 主数据 > 创建信用段。

weixin_46525734的博客 1965

Linux系统编程之——深入理解进程间通信(IPC)技术

Linux进程间通信(IPC)技术实战指南 本文深入探讨Linux系统编程中的进程间通信技术,重点介绍五种常用IPC方式及其适用场景: 管道通信:匿名管道(父子进程)和命名管道(任意进程)实现简单数据流传输 共享内存:通过内存映射实现最高效的数据共享,适合大数据量处理 消息队列:结构化消息传递,支持异步通信 信号机制:轻量级事件通知,用于紧急处理 套接字:跨网络进程通信方案 文章通过代码示例演示了匿名管道和共享内存的具体实现,分析了各种IPC技术的性能特点和适用场景。

一枚嵌入式小白菜的摸爬滚打之路 814

科研笔记:怎样写好博士论文?

博士论文外审避坑指南与写作要点 博士论文外审的核心关注点呈现5级优先级:科研成果(硬指标)>创新性>逻辑结构与场景合理性>文献综述与规范性>工作量验证。外审专家会重点核查:1)成果清单是否达标;2)创新点是否真实明确;3)章节逻辑是否自洽、应用场景是否细化;4)文献综述是否构建"研究坐标系";5)实验/理论支撑是否充分。需特别注意三大雷区:科学错误(直接挂稿)、伪创新、场景不合理。写作时应强化选题依据的场景细化,通过"发展阶段+跨领域对比"提升文献综述质量。

Grow into a more wonderful you 1064

深刻理解Linux系统进程间通信(IPC)

Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。 序 Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V

WINCOL的专栏 803

synopsys工具安装系列(一)安装installer

synopsys为eda工具安装,提供了一个安装器,名叫installer。所以,首先要先安装installer这个工具,之后才能安装其他的eda工具。 首先从官网下载该installer工具。我这里下载的是5.2版本 下载之后,有如下安装文件。 将该安装包,拷贝到linux服务器中。 首先给SynopsysInstaller_v5.2.run赋予可执行权限。 chmod a+x SynopsysInstaller_...

weiqi7777的博客 8388

YOLOv9改进策略 | Conv篇 | 2024最新ECCV最新大感受野的小波卷积WTConv助力YOLOv9有效涨点

本文给大家带来的改进机制是一种新的卷积层,称为WTConv(小波卷积层),它利用小波变换(WT)来解决卷积神经网络(CNN)在实现大感受野时遇到的过度参数化问题。WTConv的主要目的是通过对输入数据的不同频率带进行处理,使CNN能够更有效地捕捉局部和全局特征,WTConv成功解决了CNN在感受野扩展中的参数膨胀问题,提供了一种更为高效、鲁棒且易于集成的卷积层解决方案,我将其用于二次创新YOLOv9中的RepNCSPELAN4机制可以减少一定的参数量和计算量,达到一个可观的轻量化作用。

Snu77的博客 1539

linux - 进程间通信

引用 Linux RCU原理剖析(二)-渐入佳境

vertor11的博客 259

AgentScope 实战训练营-A2UI的完整实现:从概念到部署全流程

本文详细介绍了如何在AgentScope框架中实现Google的A2UI(Agent-to-Agent UI)协议,构建一个能生成可交互UI的智能体应用。文章涵盖了从环境准备、架构设计、核心代码实现到测试部署的完整流程,包括A2UI协议解析、技能系统、客户端实现、通信机制等核心技术点,适合AI Agent和前端开发人员学习参考。

program哲学 199

Linux系统--进程间通信--共享内存(主概念和理解)

方式优点缺点适用场景用户指定key(通过ftok支持进程独立启动,资源可管理,可预测需要进程间预先约定绝大多数场景,特别是C/S架构,需要持久化通信渠道系统自动生成(保证唯一,简单key不可预测,其他进程无法接入主要用于父子进程(fork之后),子进程会继承共享内存标识符这一步需要用户执行,是为了建立一个所有相关进程都能提前知晓的、稳定的通信“联络点”,从而支持灵活、持久的进程间通信。这是 System V IPC 的一种有意设计,旨在解决特定类型的通信需求。

LXdian_LX的博客 1142

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Linux】进程间通信:详解 VSCode使用 | 匿名管道

本文将带你从Linux下VSCode的高效使用入手,探索进程间通信的基础概念,并深入讲解匿名管道的原理及其实现。从连接云服务器到编写代码,一步步掌握进程间通信

No Game No Life 4305

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux系统理解+Linux内核理解

操作系统:向下控制硬件,向下提供接口(是否有mmc内存映射机制,判断是否可以使用操作系统)现代的CPU其内部会区分不同的工作模式,以此来区分不同级别和权限的操作。例如:ARM的八种工作模式- User 非特权模式,一般在执行上层的应用程序时ARM处于该模式- FIQ (快速中断模式)当一个高优先级中断产生后ARM将进入这种模式- IRQ (外部中断模式)当一个低优先级中断产生后ARM将进入这种模式- SVC (超级用户模式)当复位或执行软中断指令swi后ARM将进入这种模式。

m0_52864526的博客 914

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Linux系统---进程间通信与管道入门

进程间通信(Inter-process communication,IPC)是指不同进程之间进行信息交换和共享的一种机制。

顾得泉的博客 2171

linux——进程间通信

linux——进程间通信(IPC) 一、两个进程通过什么来进行通信 答:通过管道 进程A和进程B跑在同一台机子上,称为单机的进程间通信。 进程A和进程B跑在两台机子上,称为多机的进程间通信。 ——@上官可编程 ...

weixin_42900834的博客 363

【Linux系统编程】第三十三弹---深入探索进程间通信:原理、方式、及管道技术详解

进程为什么要通信,进程如何通信,进程间常见的通信方式;管道:什么是管道,匿名管道:定义,特点,创建与使用,测试管道接口~~~

小林熬夜学习编程的博客 1645

Linux系统编程——进程间通信

本文介绍了Linux系统中常用的进程间通信(IPC)机制,主要包括管道、信号、共享内存、消息队列和信号量。管道分为无名管道(用于关联进程)和有名管道(支持无关进程通信);信号用于进程间通知事件,可通过kill、raise等函数发送;共享内存允许进程直接访问同一物理内存,效率高但需同步机制;消息队列以链表形式存储数据,支持按类型读取;信号量用于协调进程对共享资源的访问,通过P/V操作实现同步。文章详细讲解了各种IPC机制的原理、系统调用和使用方法,并提供了示例代码演示其具体应用场景。这些IPC机制各有特点,可

2301_80366509的博客 1516

Linux操作系统--进程间通信(上)(进程间通信的目的、匿名管道)

本文介绍了进程间通信的目的,包括数据传输、资源共享、通知事件和进程控制。然后详细讨论了进程间通信的发展历程和分类,包括匿名管道、命名管道、System V消息队列、共享内存和信号量等。文章通过示例代码和原理讲解了管道的使用和工作原理,包括匿名管道、fork共享管道、文件描述符角度理解管道、内核角度理解管道等方面。最后总结了管道的特点,如具有血缘关系的进程进行通信、单向通信、面向字节流、基于文件、半双工等特点。

2301_78702440的博客 735

【Linux】进程间通信的几种方式总结

介绍与总结以下几种进程间通信方式: 管道: 匿名管道 命名管道 System V进程间通信 共享内存 消息队列 信号量 管道: 半双工通信(可选方向的单向传输)。 本质是内核中的一块缓冲区。 实现进程间通信的原理:让多个进程通过访问到相同的缓冲区来实现通信。管道实现通信使用的是系统调用的IO接口(这也遵循了一切皆文件的思想)。 1、匿名管道及代码实现 匿名管道只能用于具有亲缘...

swag_wg的博客 1122

Linux系统编程—进程间通信

一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出。当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。如果所有管道写端对应的文件描述符被关闭,则read返回0。管道是有固定大小的,多少?

Awkwardx的博客 953

Linux9-进程间通信-管道、信号

2.Ctrl+C 3.Ctrl+\ 9.强制结束11.段错误 13.管道破裂 14.为进程定时,到达时间进程结束 17.子进程结束发给父进程 18.让停止态继续执行 19,让运行态停止 20.让进程暂停转后台Ctrl+Z。mkfifo fifo(名为fifo的管道文件) int mkfifo(const char *pathname, mode_t mode);handler:typede void (* sighandler_t handler)(捕获方式处理,自定义)

2301_79207059的博客 768

进程间通信

管道,共享内存,消息队列的介绍以及简单使用(进程池+共享内存实现)

电气工程专业本科生、辅修计算机。分享嵌入式、后端等方面的系统学习路径。 631

Linux系统基础-进程间通信(1)_匿名管道

新坑来啦~ --- 进程间通信, 大概分三次讲解 Linux系统基础-进程间通信(1)_匿名管道 感兴趣的宝子们千万不要错过!!!

wer24_25的博客 1032
上一篇: Day 2
下一篇: Day 3
Tangcan-
博客等级 码龄3年 664粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值