linux之进程间通信(管道)

Linux进程间通信——管道通信详解 进程间通信:管道引言进程间通信管道 引言 进程是相互独立的,每个进程都有自己的虚拟地址空间,虚拟地址空间通过页表的映射,映射到自己的物理内存上,互不影响。正因为如此,进程间通信就变得很麻烦,操作系统为了使进程间能够通信,会提供一个介质,让多个进程都能够访问,也就是在内存上开辟一块公共资源,让进程在公共资源上交流。 进程间通信 在Linux系统中,有时候需要多个进程之间相互协作,共同完成某项任务,进程之间或线程之间有时候需要传递信息,有时候需要同步协调彼此工作,则就会出现进程间通信。 信号也是进程间通信的一种 阅读详情

今天来谈谈进程间通信:

进程间通信简称也叫ipc!

基本介绍:

操作系统提供给用户的几种进程间通信方式。
操作系统为什么要给用户提供进程间通信方式:进程的独立性(虚拟地址空间加页表)----提供一个公共的媒介。
进程间通信是干什么的:进程间数据传输,数据共享,进程控制,事件通知,也正因为有不同的应用场景(不同的需求)因此操作系统也提供了多种不同的进程间通信方式继承于unix而来的管道(匿名管道/命名管道)。

进程间通信分类

管道

  • 匿名管道pipe
  • 命名管道

System V IPC

  • System V 消息队列
  • System V 共享内存
  • System V 信号量

POSIX IPC

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

下面主要讲下管道:
管道:(匿名管道/命名管道)
管道是一个半双工通信:提供双向选择,但是只能单向传输。
管道创建成功后,提供io操作—返回文件描述符作为句柄,句柄(文件描述符)有两个:一个用于读取数据,一个用于写入数据。
有名字则可以通过名字打开相同的管道进行通信。
没有名字,因此只能通过子进程复制父进程的方式(复制了文件描述符)实现通信。
匿名管道只能用于具有亲缘关系的进程间通信。
命名管道可以用于任意的进程间通信。
管道原理:操作系统在内核提供一块缓冲区(只要进程能够访问到这块缓冲区就可以实现通信)。

匿名管道:
int pipe(int pipefd[2]);
pipefd:输出型参数—用于获取管道操作句柄
pipefd[0] 管道的读取端
pipefd[1] 管道的写入端
返回值:0 失败:-1

从本质上来说,pipe()函数的功能就是创建一个内存文件,但与创建普通文件的函数不同,函数pipe()将在参数fildes中为进程返回这个文件的两个文件描述fildes[0]和fildes[1]。其中,fildes[0]是一个具有“只读”属性的文件描述符,fildes[1]是一个具有“只写”属性的文件描述符,即进程通过fildes[0]只能进行文件的读操作,而通过fildes[1]只能进行文件的写操作。

读写特性:
管道中若没有数据,则read会阻塞,直到读取到数据(有数据写入管道了)
管道中若数据满了,则write会阻塞,直到有空闲空间(有数据被读出了)
若所有读端被关闭,则write会触发异常—SIGPIPE(导致进程退出)
若所有写端被关闭,则read读完数据之后不会阻塞,而是返回0
进程在操作管道的时候,如果没有用到某一端,则把这一端关闭掉!

实例代码如下:实现一个父写子读的过程

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<errno.h>
  5 #include<string.h>
  6 
  7 int main()
  8 {
  9     int pipefd[2];
 10     int ret = pipe(pipefd);      //创建一个匿名管道
 11     if(ret<0){
 12         perror("pipe error!");
 13         return -1;
 14     }
 15     int pid = fork();
 16     if(pid<0){
 17         perror("fork error!");
 18         return -1;
 19     }
 20     //实现父子之间的通信 父写 子读
 21     else if(pid==0){
 22         while(1){
 23             close(pipefd[1]);  //子进程只读的话就把写端关闭
 24             sleep(1);
 25             char buf[1024]={0};
 26             ret  = read(pipefd[0],buf,1023);
 27             if(ret<0){
 28                 perror("read error!");
 29             }
 30             else{
 31                 printf("buf:[%s]\n",buf);
 32             }
 33         }
 34     }
 35     else{
 36         close(pipefd[0]);             //父进程只写就关掉读端
 37         int i = 0;
 38         while(1){
 39             sleep(1);
 40             char* ptr = "hello my child !";
 41             i += write(pipefd[1],ptr,strlen(ptr));
 42             printf("ret:%d\n",i);
 43         }
 44     }
 45
 46     return 0;
 47 }

这样就实现了基本的父写子读功能!

命名管道:
管道可以见于文件系统,会创建一个管道文件(文件只是名字)
管道通信的本质还是内核的那块缓冲区
int mkfifo(const char *pathname, mode_t mode);
pathname: 管道文件的路径名
mode: 创建文件的权限
返回值:0 失败:-1

由于需要由管道自身来保证通信进程间的同步,命名管道也是一个只能单方向访问的文件,并且数据传输方式为FIFO方式。
也就是说,命名管道提供了一个路径名与之关联,以FIFO的文件形式存在于文件系统中,在文件系统中产生一个物理文件,其他进程只要访问该文件路径,就能彼此通过管道通信。在读数据端以只读方式打开管道文件,在写数据端以只写方式打开管道文件。

打开特性:
若管道文件没有被写的方式打开,则以只读打开会阻塞
若管道文件没有被读的方式打开,则以只写打开会阻塞
读写特性雷同于匿名管道

实例代码如下:创建命名管道,通过一个文件,实现一端写,一端读并显示到终端上。

  //fifo_read.c
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<fcntl.h>
  5 #include<errno.h>
  6 
  7 int main()
  8 {
  9     char* ptr = "./a.fifo";                 //这就是提供的公共访问路径名
 10     int ret = mkfifo(ptr,0664);              //0664是权限,可以自由设置
 11     if(ret<0){
 12         if(errno!=EEXIST){                   //如果不是早已存在的话,就说明创建失败
 13          perror("mkfifo error");
 14          return -1;
 15         }
 16     }
 17     printf("mkfifo sucess!\n");
 18     int fd = open(ptr,O_RDONLY);             //以只读方式打开
 19     if(fd<0){
 20         perror("open error!\n");
 21         return -1;
 22     }
 23     printf("open fifo sucess!\n");
 24     while(1){
 25         sleep(10);
 26         char buf[1024]={0};
 27         int ret = read(fd,buf,1023);     
 28         if(ret<0){
 29             perror("read error!\n");
 30             return -1;
 31         }
 32         else if(ret==0){
 33             printf("write closed!\n");
 34             return -1;
 35         }
 36         printf("buf:[%s]\n",buf);
 37     }
 38     close(ret);
 39     return 0;
 40 }
//fifo_write.c
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<fcntl.h>
  4 #include<unistd.h>
  5 #include<string.h>
  6 #include<errno.h>
  7 
  8 int main()
  9 {
 10     char* ptr = "./a.fifo";
 11     int ret = mkfifo(ptr,0664);
 12     if(ret<0){
 13         if(errno!=EEXIST){
 14             perror("mkfifo error!\n");
 15             return -1;
 16         }
 17     }
 18     printf("mkfifo success!\n");
 19     int fd = open(ptr,O_WRONLY);           //以只写方式打开
 20     if(fd<0){
 21         perror("open error!\n");
 22         return -1;
 23     }
 24     printf("open fifo success!\n");
 25     while(1){
 26         char buf[1024]={0};
 27         scanf("%s",buf);
 28         write(fd,buf,strlen(buf));        //将指定内容写到fd所指区域
 29     }
 30     close(ret);
 31     return 0;
 32 }

运行结果如下:我xshell6开了两个窗口
这是写端的情况:
在这里插入图片描述
下面是读端的情况:
在这里插入图片描述
可以看到写端关闭后,读端没有阻塞,而是正常退出了!

小结

管道:本质是内核的一块缓冲区
匿名管道只能用于具有亲缘关系的进程间通信/命名管道可以用于任意的进程间通信
管道的读写特性+命名管道的打开特性
管道是半双工通信—可选方向的单向通信
管道的生命周期随进程
管道提供流式服务—字节流传输(传输灵活/数据粘连)
管道自带同步与互斥功能(读写操作数据大小不超过PIPE_BUF大小,读写操作受保护)
互斥:对临界资源(公共资源)的唯一访问性(我操作的时候别人不能操作)
同步:对临界资源访问的时序可控性(我操作完了别人才能操作)
管道的同步与互斥体现就是:管道没有放数据则读阻塞,放了数据之后唤醒对方阻塞,
对方读数据(我放了,你才能读–同步),我数据往管道中没放完别人不能读也不能写(互斥)。
管道提供字节流服务

Linux进程间通信-管道 其实就是文件表的下标值。 阅读详情

相关推荐

使用Python中的管道操作执行Linux命令

通过这种方式,我们可以在Python中使用管道操作执行复杂的Linux命令,并获取相应的输出结果。请注意,上述示例中的命令和参数仅作为演示目的,并不一定适用于所有的情况。根据具体的需求,你可以使用不同的命令和参数来实现你所需的功能。管道操作允许我们将一个命令的输出作为另一个命令的输入,从而实现更复杂的操作。希望这个示例能帮助你理解如何在Python中使用管道操作执行Linux命令。,并将其输出通过管道传递给下一个命令。,并将第一个命令的输出作为其输入。,并将第二个命令的输出作为其输入。

HackNebulaZ的博客 286

linux fifo python,使用命名(fifo)管道在python和c之间传输数组(图像)++

我需要通过一个名为FIFO的管道从python进程向c++进程发送一个数组(表示图像),然后以另一种方式返回(在Linux系统上)。在当在两个Python进程之间使用命名管道时,下面的代码非常有用。它使用numpy的tostring()和fromstring()函数:通过命名管道(Python)发送帧在import cv2import numpy as npfrom time import sle...

weixin_42349272的博客 416

基于USB总线的虚拟摄像头(UVC)原理简介

前面文章中我们分析了虚拟声卡的实现,在文章中我们展示了创建一个虚拟麦克风和虚拟扬声器的技术原理。完成了音频的虚拟化之后,这里就要谈论一下对于视频的虚拟化了——虚拟摄像头的实现。关于虚拟麦克风和虚拟扬声器的实现,可以参考。虚拟摄像头应用也是非常普遍的,例如云桌面远程摄像头的实现,直播技术。目前对于虚拟摄像头有三种实现方式:DirectShow虚拟摄像头,这个是一种比较古老的技术;在新版本应用中,该项技术基本失效了,尤其是UWP框架程序,DirectShow虚拟摄像头就失效了。

tianxilink的博客 5416

python linux管道,Linux:管道进入Python(ncurses)脚本,stdin和termios

我目前正在尝试用Python编写一个简单的脚本:我想为脚本提供输入 – 通过命令行参数;或者通过“管道”字符串到此脚本 – 并让脚本使用curses终端接口显示此输入字符串.完整的脚本,这里称为testcurses.py,如下所示.问题是每当我尝试实际的管道时,这似乎搞乱了stdin,而curses窗口从未显示过.这是一个终端输出:## CASE 1: THROUGH COMMAND LINE A...

weixin_39988888的博客 416

资金穿透分析

我们把准备好的银行数据导入到软件中,导入具体步骤这里不做详解,大家可以通过“清林情报分析师”公众号,查看操作视频第二节

清林情报分析师 3491

在Windows10上安装WSL2

WSL2是微软提供的Windows子系统,允许在Windows 10和11上运行Linux环境,提供更好的性能和兼容性。安装WSL2需要启用WSL功能、更新系统、安装WSL2内核,并设置为默认版本。之后,可以通过Microsoft Store安装Linux发行版,并使用WSL命令启动和管理它们。

howard2005的专栏 5942

Linux——进程间通信(管道)

管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”who程序运行成进程后,将数据输出到管道中,然后管道又将数据输入到wc进程中。函数原型pipe函数里面的这个参数是一个输出型参数,也就是当我们使用pipe函数的时候,可以得到fd[0]和fd[1]。这两个分别被称为读端和写端,匿名管道如同在生活中的天然气管道。只能从天然气公司到你家,是单向的。参数fd[2]是一个文件描述符数组。fd[0]为读端(为了便于记忆我们可以把0当做一个嘴巴)

m0_57249790的博客 1690

RK3588 ENV 环境配置之 fw_printenv

RK3588 ENV环境配置指南 本文详细介绍了在RK3588平台上配置ENV环境变量的完整流程。首先需要在parameter分区表中划分env分区,然后在U-Boot中配置MMC偏移地址。接着编译fw_printenv工具并部署到目标设备,配置fw_env.config文件指定存储位置。重点解决了内核中读写ENV时遇到的CRC校验问题,通过U-Boot的saveenv命令初始化环境变量存储区域。最后展示了如何使用fw_printenv/fw_setenv工具在内核中读写ENV变量,并建议将配置集成到根文件

501846585_QQAndroid_java 1033

python 命名管道_命名管道实践

命名管道技术实验管道介绍管道(Pipe)是一种进程间的通信机制,Windows、Linux和UNIX都使用这种机制。管道是通过I/O接口存取的字节流创建管道后,通过使用操作系统的任何读或写I/O系统调用来读或者写它。创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。Linux管道是通过返回两个文件描述符来实现双向I...

weixin_39923599的博客 760

基于毫米波雷达的智能风扇算法设计与实现

摘要:本文设计了一种基于毫米波雷达的智能风扇控制系统,采用FMCW雷达实现人体目标的精准检测与定位。系统通过距离FFT、速度FFT、CFAR检测和AoA估计构建完整的信号处理链路,并针对风扇叶片干扰设计了基于自相关函数的抗干扰算法。创新性地提出了人在开机、多人优先送风、摇头追踪等控制策略。研究采用MATLAB完成全链路算法仿真验证,并在STM32平台上实现实物系统。实验表明,该系统可实现0.15m测距精度和±60°方位角覆盖,有效解决了传统风扇的能源浪费和用户体验问题。本文提供了完整的MATLAB仿真代码和

huanghm88的专栏 404

图神经网络实战(7)——图卷积网络(Graph Convolutional Network, GCN)详解与实现

图卷积网络 (Graph Convolutional Network, GCN) 架构由 Kipf 和 Welling 于 2017 年提出,其理念是创建一种适用于图的高效卷积神经网络。在本节中,我们将讨论 Vanilla GNN 架构的局限性,并详细介绍 GCN 的工作原理,通过使用 PyTorch Geometric 在 Cora 和 Facebook Page-Page 数据集上实现 GCN 来验证其性能。

盼小辉丶的博客 2万+

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Wzs040810的博客 2412

YOLOv11目标检测模型性能评价指标详解,涉及混淆矩阵、F1-Score、IoU、mAP、参数量、计算量等,一文打尽所有评价指标

本文主要讲解的是计算机视觉网络模型的性能评价指标,这是每一篇论文中都需要展示的内容。熟悉每一个评价指标也能够帮助我们在训练和改进模型过程中,更好的观察模型的变化效果。

Limiiiing的博客 8410

Linux 进程间通信(管道)

进程间通信、匿名管道、命名管道 ...

2201_75663820的博客 2734

电磁阀颤振工作原理

颤振 颤振,弹性结构在均匀气(或液)流中受到空气(或液体)动力、弹性力和惯性力(见达朗伯原理)的耦合作用而发生的大幅度振动,它是气动弹性力学中最重要的问题之一。 随着机电液一体化技术的发展,电液比例控制技术的应用越来越广泛。电液比例控制系统范围较广,在液压传动与控制过程中,系统能够接受模拟信号或数字信号,使输出的流量或压力连续成比例地变化,都属于此类。该控制系统的优点是充分利用了液压控制与电气控制的长处,即功率传递靠液压,信号处理靠电气的优化措施。 电液比例控制原理与要求 液压控制系统中两个最重要的被控参数

小幽余生不加糖 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Linux】进程间通信——命名管道

匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用命名管道来做这项工作。在Linux系统中,命名管道(也称为FIFO)是一种特殊的文件类型,它允许进程间进行通信。与匿名管道不同,命名管道存在于文件系统中,并且可以被任何有适当权限的进程访问。命名管道提供了一种方法,使得不相关的进程能够通过预先定义好的路径来交换数据。匿名管道由pipe函数创建并打开。而命名管道由mkfifo函数创建,打开⽤open。FIFO(命名管道)与pipe。

Renswc的博客 3324

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Linux】进程间通信之匿名管道

进程通信之匿名管道通信的概念和实现

s_little_monster的博客 8175

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux进程间通信之匿名管道

进程间通信介绍 1. 进程间通信的目的 2. 进程间通信发展 什么是管道 匿名管道 1. 什么是匿名管道 2. 匿名管道样例详解 3. 原理 4. 单个父进程与多个子进程管道间通信 建立子进程任务相关的头文件 主文件的建立 执行结果 5. 管道读写规则 6. 管道特点

立志做一个高产且细节博主 2145

Linux之进程间通信——管道

管道是Linux中最古老的进程间通信的方式,本文介绍了进程间通信的相关概念,主要介绍了匿名管道和命名管道。

一只小卷毛的博客 2801

Linux进程间通信【匿名管道】

进程间通信简称为IPC(Interprocess communication),是两个不同进程间进行任务协同的必要基础。进行通信时,首先需要确保不同进程之间构建联系,其次再根据不同的使用场景选择不同的通信解决方案,本文主要介绍的通信解决方案为匿名管道

北 海的博客 1万+

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

在某些场景下我们需要不同进程之间进行(1)基本数据的交互。(2)发送命令。(3)实现某种协同。(4)通知某些信息……

weixin_51142926的博客 4342

Linux 进程间通信——管道

本篇博客主要介绍了Linux中进程间通信的一种基础方式——管道,包括匿名管道和命名管道的基本原理、特性及代码实现。匿名管道适用于父子进程间的单向通信,而命名管道则可以用于任何没有亲缘关系的进程间通信。理解管道的特性和使用方法,是掌握Linux进程间通信的关键步骤。

wxk2227814847的博客 1426

深入了解linux系统—— 进程间通信之管道

进程间通信与管道 进程间通信(IPC)是指在同一台计算机或不同计算机上的进程之间进行数据交换的技术。由于进程具有独立性,必须通过操作系统提供的共享资源实现通信。常见的IPC方式包括管道、共享内存、消息队列、信号/信号量以及套接字。 管道分为匿名管道和命名管道。匿名管道通过pipe()系统调用创建,适用于父子进程间的单向通信。其本质是一个由操作系统维护的无名文件,父子进程通过继承文件描述符访问同一资源。代码示例展示了子进程写入、父进程读取的通信过程,验证了管道的数据传输功能。 管道通信存在四种典型情况:单向读

LH__1314的博客 1627

Linux进程间通信——使用命名管道

在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。 一、什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系

ljianhui的专栏 8万+

【Linux】进程间通信介绍 | 管道

本篇博客主要讲解了什么是进程间通信、进程间通信的目的、什么是管道、管道的原理、匿名管道、管道的特点、命名管道等等。

joy.728的博客 2329
上一篇: 剑指offer_01 二维数组中的查找
下一篇: 剑指offer_02 从尾到头打印链表
Python_programer
博客等级 码龄9年 25粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值