【linux系统】进程间通信1--管道

Linux内核入门(八)——进程间通信:有名管道 Linux内核入门(八)——进程间通信:有名管道前言有名管道进程间通信实验 前言 上回书说到,为了实现无亲缘关系进程之间通信,可以使用有名管道, 那么这个有名管道相比无名管道,有什么不同的地方呢? 使用有名管道是会在文件系统中创建一个管道文件的。 无名管道中可没有提到过文件这个东西。 既然有名管道是以文件的方式存在的,那么不同进程之间当然可以通过读写这个文件来实现进程间通讯。 注:Linux下有7种文件类型: 文件类型 创建方法 - 普通文件 open() d 目录文件 mkdir() 阅读详情


进程间通信

是什么?

进程间通信(Inter-Process Communication,IPC)是指在操作系统中,不同的进程之间进行数据交换、信息传递和同步操作的机制。在多任务操作系统中,不同的进程可能同时运行,它们之间可能需要进行数据共享、协作完成某项任务等操作,这就需要进程间通信。
进程间通信目的:

  1. 数据传输:一个进程需要将它的数据发送给另一个进程
  2. 资源共享:多个进程之间共享同样的资源。
  3. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
  4. 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

如何理解进程间通信:本质是让不同的进程看到同一份资源。

  1. 那如何让不同进程看到同一份资源呢?
  2. 资源又是什么呢?

如何做?

进程间通信的分类:
管道

  1. 匿名管道pipe
  2. 命名管道

System V IPC

  1. System V 消息队列
  2. System V 共享内存
    3 .System V 信号量

POSIX IPC

  1. 消息队列
  2. 共享内存
  3. 信号量
  4. 互斥量
  5. 条件变量
  6. 读写锁

本篇重点介绍管道

管道

管道是Unix中最古老的进程间通信的形式,所谓的“管道”,指的是从一个进程连接到另一个进程的一个数据流。
在这里插入图片描述
如何理解?
对于一个文件,我们普遍印象如下图,进程打开文件,通过写(读)操作,写入(读取)文件缓冲区,再由文件缓冲区刷新到磁盘里。
在这里插入图片描述
现在有一类文件,它抛弃了最后一步,即将缓冲区的内容刷新到磁盘上,所有操作仅在内存上完成。这一类文件即是内存级文件。
假如现在该进程创建了一个子进程,子进程会继承父进程的file_struct,故都指向了一个内存级文件,现在我们便实现了让不同的进程看到同一份资源。然后我们让父进程和子进程一个只读,一个只写,不就可以实现两者进行单向通信了吗?而这种特殊的文件就是管道。这也符合linux下一切皆文件的观点。
在这里插入图片描述
管道有两种,匿名管道和命名管道。
匿名管道应用于具有血缘关系的进程
命名管道应用于无血缘关系的进程

匿名管道

#include <unistd.h>
功能:创建匿名管道
原型
int pipe(int pipefd[2]);
参数
pipefd:文件描述符数组,输出型参数,其中pipefd[0]存放读端的文件描述符, pipefd[1]存放读端的文件描述符
返回值:成功返回0,失败返回错误代码

管道通常是单向通信,主要是为了简化设计。如果要进行双向通信,那就创造两个管道。
在这里插入图片描述

#include <unistd.h>
#include <cassert>

int main()
{
    //创建管道,让父进程写,子进程读
    int pipefd[2];
    int n = pipe(pipefd);
    assert(n != -1);
    pid_t id = fork();
    if(id == 0)
    {
        //子进程 -- 读取管道
        close(pipefd[1]);//关闭写端,留下读端
        
        //……子进程接受数据
 
        close(pipefd[0]);
        exit(0);
    }
    else if(id > 0)
    {
        //父进程 -- 写入管道
        close(pipefd[0]);//关闭读端,留下写端

        //……父进程写入数据 
        
        close(pipefd[1]);
    }
    return 0;
}

命名管道

上面讲到的匿名管道应用于具有血缘关系的管道,如果我们要让俩个不相干的进程进行通信,就要使用命名管道。

linux下有个命令mkfifo,它的作用是创造一个文件类型为p的文件。使用时:mkfifo filename 如下图:

在这里插入图片描述
命名管道和匿名管道的性质一样,是一种特殊的文件形式,不存储数据,只传递数据。
因此它的文件大小一直显示为0。
使用如下:
在这里插入图片描述

linux也提供了mkfifo的函数接口,如下
在这里插入图片描述

参数:mode即文件权限
下面是一个简单演示:

common.hpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cerrno>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#define FIFO_PATH "./myfifo"
#define MODE 0664

enum sfw
{
    FIFO_MKFIFO = 1,
    FIFO_OPEN,
    FIFO_READ,
    FIFO_UNLINK
};

client.cc

#include "common.hpp"

using namespace std;

int main()
{
    int fd = open(FIFO_PATH, O_WRONLY);
    if(fd < 0)
    {
        perror("open");
        exit(FIFO_OPEN);
    }
    string line;
    while(1)
    {
        cout << "clien sent# ";
        getline(cin, line);
        write(fd, line.c_str(), line.size());

    }
    close(fd);
    return 0;
}

server.cc

#include "common.hpp"

using namespace std;

int main()
{
//创建管道
    int n = mkfifo(FIFO_PATH, MODE);
    if(n == -1)
    {
        perror("mkfifo");
        exit(FIFO_MKFIFO);
    }
//打开管道
    int fd = open(FIFO_PATH, O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        exit(FIFO_OPEN);
    }
    //
    while(1)
    {
        char buffer[1024] = {0};
        int x = read(fd, buffer, sizeof(buffer));
        if(x > 0)
        {
            buffer[x] = 0;
            cout << "clien say@ " << buffer << endl;
        }
        else if(x == 0)
        {
            cout << "client quit" << endl;
            break;
        }
        else 
        {
            perror("read");
            exit(FIFO_READ);
        }
    }
    close(fd);

    int x = unlink(FIFO_PATH);//删除管道
    if(x == -1)
    {
        perror("unlink");
        exit(FIFO_UNLINK);
    }
    cout << "server quit" << endl;
    return 0;
}
FreeRTOS实战:如何避免HAL_Delay在高优先级中断中的坑(附TIM6配置指南) 本文深入剖析了在STM32 FreeRTOS项目中,于高优先级中断内调用HAL_Delay函数导致系统假死的根本原因——SysTick时基被FreeRTOS占用且优先级最低。文章提供了治本方案:通过配置TIM6作为独立且最高优先级的HAL时基,实现与FreeRTOS系统心跳的解耦,并附上详细的CubeMX配置与代码移植指南,确保系统实时性与稳定性。 阅读详情

相关推荐

[ESP32]:基于esp-modbus实现serial主机

[ESP32]:基于esp-modbus实现serial主机

LINKKEEE的博客 2567

【Linux】系统部分——进程间通信1(管道)

摘要 本文介绍了进程间通信(IPC)的核心机制之一——管道。管道本质上是操作系统提供的内核缓冲区,通过两个struct file对象分别管理读端和写端,实现父子进程间的数据共享。文章详细讲解了管道创建的系统调用pipe(),并通过代码示例展示了父子进程如何利用管道进行单向通信。同时补充了标准输出流std::cout与标准错误流std::cerr的区别及重定向技巧。管道作为IPC的重要方式,其特点是进程共享同一块内核缓冲区资源,而非实际磁盘文件,确保了通信效率。

feng_qi0325的博客 1226

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

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

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

wer24_25的博客 1032

Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive 完全分布式高可用集群搭建(保姆级超详细含图文) 附安装包网盘下载

Hadoop+Spark+Flink+Zookeeper+Kafka+Hbase+Hive完全分布式高可用集群搭建 Hadoop高可用集群搭建 Spark高可用集群搭建 Flink高可用集群搭建 Zookeeper高可用集群搭建 Kafka高可用集群搭建 Hbase高可用集群搭建 Hive高可用集群搭建 mysql搭建 jdk部署 大数据集群环境搭建

Mr.L-OAM的博客 2万+

基于Simulink的双向DC-DC变换器在储能系统中的应用仿真

摘要:本文详细介绍了基于Simulink的双向DC-DC变换器在光伏储能系统中的仿真实现。主要内容包括:1)采用非隔离型双向Buck-Boost拓扑作为储能系统枢纽;2)针对750V直流微网中的20kWh锂电池接口场景进行建模;3)详细阐述双闭环控制器设计(电压外环+电流内环)、工作模式判断逻辑等关键步骤;4)通过仿真验证了系统在功率阶跃和模式切换下的性能。文章提供了完整的建模流程和控制方法,为储能系统接口设计提供了实用参考。

amy_mhd的博客 178

Linux操作系统4-进程间通信1(通信与管道实现通信)

进程间通信简介,管道通信,匿名管道通信举例

yzc的博客 1284

uniapp - 详细手机端h5网页调用手机摄像头进行二维码识别扫描,在uniapp的H5移动端微信网页平台中,在浏览器中调用手机扫码功能详细教程,识别二维码并获取扫描结果(完整示例源码,一键复制即用

uniapp,h5,手机端网页,H5手机网页,uniapp开发h5实现扫码功能,uniapp微信h5网页扫码sdk使用教程,uniapp h5网页如何实现浏览器扫码,uniapp扫码功能怎么兼容h5_uniapph5怎么做扫码功能,uniapp的手机网页如何实现扫二维码一维码,浏览器H5实现js扫码,H5调用摄像头和扫一扫功能,亲测可用,H5调用本地摄像头实现扫一扫,uni-h5项目解决扫码功能,uniapp实现微信H5扫码,解决uniapp在H5端使用不能扫码问题,uni-app的h5扫码(二维码、条形码

✅ 精选推荐文章 1万+

Linux系统编程:进程间通信 1:管道

此时,写操作,会导致管道破裂,SIGPIPE //这个信号会使得程序结束。管道如果为空,此时可以一直写,直到写满,此时写操作阻塞。(1)pipefd //用来获取 管道的两端 //读端pipefd[0]写端为pipefd[1],读端为pipefd[0];管道中没有数据,则读操作不阻塞,立即返回。管道中有数据,则读取数据,最终把数据读完。管道中有数据,则读取数据,最终把数据读完。(2)管道操作特点 :数据读走之后,认为就没了。管道中没有数据,则读操作阻塞。4写端不存在,读管道。(6) 信号量集()(同主机)

niikkoo的博客 472

探索数据库领域 SQL 的 JSON 数据处理技巧

在当今数字化时代,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于各种领域,如 Web 应用、移动应用、大数据处理等。数据库作为数据存储和管理的核心,需要具备处理 JSON 数据的能力。本文章的目的在于深入探索 SQL 语言在数据库中处理 JSON 数据的技巧,涵盖从基础的 JSON 数据查询到复杂的 JSON 数据操作,帮助读者全面了解和掌握 SQL 处理 JSON 数据的方法。

2502_91592937的博客 924

芯片原厂linux驱动开发的分享

大家好,我是XX,来自湖南XX学院,电子信息18级,也曾在创新基地控制组学习过两三年,毕业后就职于一家芯片原厂的解决方案部,担任驱动工程师的职位,算上实习期,我的工作时长已有两年。在此我想将这两年期间学习与积累到的一些经验输出出来,与大家一同分享。知识面有限,只能简单介绍一些驱动开发方向的一些经验,且由于经验尚浅,文中难免会有一些疏漏和错误之处,还请大家积极地批评指正。

嵌入式技术开发 848

c++ pipe 管道_Linux系统编程1.4:操作系统进程间通信_管道pipe

一. 管道简介:管道(pipe)是一种最古老的IPC机制,作用于有血缘关系的进程之间,完成数据传递。Linux系统提供了pipe系统函数用于创建一个管道。常见的通信方式有,单工通信、半双工通信、全双工通信,管道是一种半双工通信。管道的特点:1. 其本质是一个伪文件(实为内核缓冲区);2. 由两个文件描述符引用,一个表示读端,一个表示写端。3. 采用半双工通信方式,管道的一端只能用于读,另一端只能用...

weixin_30269201的博客 519

详细解读经典跨模态对齐技术Q-Former代码

介绍BLIP2的博客层出不穷,介绍Q-Former的博客也不少,但是详细解读Q-Former代码的博客很少。这篇博客希望以代码为基础,讲明白Q-Former的原理和核心思想,并详细解读一些值得注意的细节。希望读者们能从这一经典技术中朝花夕拾,得到启发。

沉迷单车的追风少年 2459

Linux系统编程之进程间通信___1.基本概念+管道通信

什么是线程间通信?进程通信:在用户空间实现进程通信是不可能的,通过Linux内核通信线程间通信:可以在用户空间就可以实现,可以通过全局变量通信。

weixin_56464518的博客 393

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

基于管道的进程通信实验_Linux系统编程1.4:操作系统进程间通信_管道pipe

一. 管道简介:管道(pipe)是一种最古老的IPC机制,作用于有血缘关系的进程之间,完成数据传递。Linux系统提供了pipe系统函数用于创建一个管道。常见的通信方式有,单工通信、半双工通信、全双工通信,管道是一种半双工通信。管道的特点:1. 其本质是一个伪文件(实为内核缓冲区);2. 由两个文件描述符引用,一个表示读端,一个表示写端。3. 采用半双工通信方式,管道的一端只能用于读,另一端只能用...

weixin_39983383的博客 178

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

基于管道的进程通信实验_Linux系统编程1.5:进程间通信_命名管道FIFO

一. 命名管道(FIFO)简介:命名管道(FIFO) ,不同于匿名管道,命名管道可以进行“非父/子关系”进程间通信,而且以文件节点的形式在。下面是一个命名管道文件:prw-rw-rw- 1 Administrator None 0 Nov 4 07:37 fifo1p代表的就是管道。命名管道以一种特殊的文件形式存在,在提供管道功能的同时,也具有了普通文件的优点(可以同时被多个进程夹享)。二. 命名...

weixin_39714113的博客 186

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)

在Linux系统中,进程是资源分配的最小单位,每个进程拥有独立的虚拟地址空间,进程与进程之间天然隔离,不能直接访问对方内存空间。 但实际业务开发中,多个进程经常需要交换数据、同步状态、互相通知事件,于是操作系统提供了IPC(InterProcess Communication,进程间通信) 这套机制,用来完成进程之间的数据交互与协同工作。

2201_75490992的博客 180

Linux系统编程-进程间通信1、pipe匿名管道 2、命名管道 3、文件 4、mmap共享内存映射

【代码】Linux系统编程-进程间通信1、pipe匿名管道 2、命名管道 3、文件 4、mmap共享内存映射。

rrrrrrrrtgghyhbh的博客 176

Linux系统编程_进程间通信第1天:IPC、无名管道pipe和命名管道mkfifo(半双工)、消息队列msgget(全双工)

【代码】Linux系统编程_进程间通信第1天:IPC、无名管道pipe和命名管道mkfifo(半双工)、消息队列msgget(全双工)

Jaci133的博客 300

linux进程间通信——有名管道

无名管道只能在父子进程之间进行通信,有名管道提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,任意两个进程通过 FIFO 都能交换数据。要注意FIFO的内容不在磁盘中,而是在内存中。有名管道的本质是文件,FIFO同样有文件描述符,同样可以使用open/write/read等函数,明白这一点的话的话编程就容易很多了。

weixin_55886550的博客 1361

Linux管道通信

#include<unistd.h> int pipe(int fd[2]); 用于创建管道用于进程间通讯,函数调用成功返回0,失败返回-1并设置errno,只能用于单向通讯,fd[0]用于读,fd[1]只能用于写,不能反过来用。如果需要实现双向通讯,需要两个管道。 ...

c524136414的博客 165

ARM linux进程间通信API

1.管道通信  linux管道主要包括俩种:无名管道和有名管道(FIFO)  int pipe(fd[2])    fd[2]是存放管道的两个文件描述符的数组,它只能应用与有血缘关系的两个进程,通信原理是:父进程用这个函数创建一个管道,建好后,此时已经给参数fd数组赋值了,所赋的值就是管道两端的两个文件描述符,一个读管道,一个写管道,但是这样实现的仅是一个进程读写,但是,创建的子进程,

shieh的专栏 1448

进程间通信:匿名管道

父进程先通过os读写同时指向一个管道文件,通过fork()创建子进程,此时父子进程同时可以读写这个管道文件,然后父进程关闭写,子进程关闭读,就实现了字子读父写的进程间通信。管道文件的特点,只允许单向通信,双向通信需要建立两个管道,因为这样方便区分哪部分是要发送的,哪部分是要接受的。,所以两个struct file*指向不同的struct file ,一个用来读取,一个写入,但他们会指向同一个方法集,inode 和文件缓冲区(内容)。,所以3个子进程都能看到这两个管道,然后不同管道关闭不需要的读写端就行。

qq_72916130的博客 1292

六、进程间通信 (匿名管道)

加油.

wljy1的博客 252

【Linux 系统编程】IPC 进程间通信全解:管道、有名管道与信号

⚠️ 无名管道没有路径名,只能经由继承的文件描述符访问,因此通常用于亲缘进程(父子、兄弟)之间;但只要 fd 能被传递(如fork()继承、或经 UNIX 域 socket 的SCM_RIGHTSancillary message 传递),无亲缘关系的进程同样可以使用。有名管道则相反:它在文件系统中有一个FIFO 特殊文件节点(有路径名),因此可以用于同一主机上任意进程间通信。有名管道以特殊文件(FIFO 文件)形式存在于文件系统中,ls -l查看时文件类型位为p。同一主机上任意两个进程。

m0_69717451的博客 307

【Linux】七、进程间通信

进程间通信介绍|匿名管道|命名管道详解

枫叶先生的博客 1169
上一篇: 【linux系统】动静态库
下一篇: 【linux】进程1 -- 状态和优先级
ProcedureStone
博客等级 码龄4年 254粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值