《Linux系统编程篇》管道(Linux 进程间通信(IPC))——基础篇

文章目录

  • 引言
  • 理解 Linux 进程间通信(IPC)基础
    • 什么是进程间通信(IPC)?
  • 管道(Pipe)的基本介绍
    • 使用场景:
    • 管道特点:
    • 管道类型:
      • 匿名管道
      • 命名管道(FIFO)
  • 结论

坚持不懈,努力奋斗,每一步都是通向成功的征程。在追逐梦想的路上,坚定的信念和不屈的意志将成就辉煌的明天。愿你勇敢面对挑战,坚定前行,绽放出属于自己的光芒。加油!✨🌟

——家驹

引言

《Linux系统编程篇》——基础篇首页传送门
我们学习了,forkwaitwaitpidexit,以及exec系列函数等,但是还是相当局限,唯一能够通讯的还是等待子进程结束靠着wait等待,中间好像没有办法在传递消息了,内存又是独立,我怎么能实现呢,还是上节说到的,丰富自己。提高自己的认知,加油吧,我们开始学习新的内容,进程之间的通讯在技术领域我们称之为IPC

理解 Linux 进程间通信(IPC)基础

进程间通信(Inter-Process Communication,IPC) 是操作系统中使不同进程交换数据、协同工作的机制。进程间通信广泛用于客户端-服务器应用、多进程应用及系统服务中。Linux 提供了多种 IPC 方式,本文将介绍几种主要的 IPC 方法:管道、消息队列、共享内存和信号。


什么是进程间通信(IPC)?

在 Linux 中,进程是相互独立的,每个进程都有独立的内存空间。为了在不同进程之间交换数据,操作系统提供了各种 IPC 机制。这些机制可帮助进程完成数据共享、同步、通知和事件处理等任务。

常见的 IPC 方式包括:

  • 管道(Pipe)
  • 命名管道(FIFO)
  • 消息队列(Message Queue)
  • 共享内存(Shared Memory)
  • 信号(Signal)
  • 套接字(Socket)

管道(Pipe)的基本介绍

管道是最简单的 IPC 方式之一,适合在具有亲缘关系的进程(如父子进程)之间传递数据。管道是单向的,数据只能从一端流向另一端。它允许一个进程的输出直接作为另一个进程的输入。管道是一种半双工的通信方式,数据只能在一个方向上流动。

我们在没有学习进程通讯的时候,我们其实就已经在使用管道了,当我们使用命令行|(竖线shift+\)其实就已经使用管道了,我们回忆一下。

还记得之前我们使用ps -aux命令的时候吗,我们使用了管道(pipe)grep配合进行了筛选,筛选出来了我们想要的数据。

使用场景:

  • 进程间通信:父子进程之间或者兄弟进程之间进行数据传输。

  • 管道重定向:将一个进程的输出重定向到另一个进程的输入。

  • Shell命令管道:通过管道将多个命令连接起来,实现数据流的传递。

管道特点:

  • 单向通信:管道是单向的,数据只能从一个端口流向另一个端口。

  • 半双工通信:管道可以同时读写,但不能同时进行读写操作。

  • 进程间通信:管道通常用于实现父子进程或者兄弟进程之间的通信。

管道类型:

管道我们分俩种类型,一种是有名字的管道(命名管道),一种是没有名字的管道(匿名管道),我们来看两者的区别。

  • 匿名管道(Anonymous Pipe):最常见的管道类型,用于在父子进程或者兄弟进程之间进行通信。通过pipe系统调用创建,通常是一种临时的通信方式。

  • 命名管道(Named Pipe,FIFO):是一种特殊类型的文件,可以在不相关的进程间进行通信。通过mkfifo命令或系统调用创建,通常用于持久性通信。

看上去只是调用的系统接口不一样,我们直接上代码直观的了解一下。

匿名管道

#include <unsistd.h>
int pipe(int pipefd[2]);

用法:

  1. 使用 pipe() 系统调用创建管道。
  2. 管道有两个文件描述符:一个用于读取,另一个用于写入。
  3. 父进程和子进程可以通过管道实现数据传输。

示例代码:

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main() {int fd[2];char buffer[20];// 创建管道if (pipe(fd) == -1) {perror("pipe failed");return 1;}if (fork() == 0) { // 子进程close(fd[0]); // 关闭读端char message[] = "Hello from child!";write(fd[1], message, strlen(message) + 1); // 写入管道close(fd[1]);} else { // 父进程close(fd[1]); // 关闭写端read(fd[0], buffer, sizeof(buffer)); // 从管道读取printf("Parent received: %s\n", buffer);close(fd[0]);}return 0;
}

结果:
在这里插入图片描述

父进程创建了一个管道,然后通过fork创建了一个子进程,父子进程之间通过管道进行通信。子进程向管道中写入一个消息,父进程从管道中读取该消息,并输出到标准输出。

在代码中,子进程关闭了管道的读端(fd[0]),然后向管道的写端(fd[1])写入消息。父进程关闭了管道的写端,然后从管道的读端读取消息到buffer中,并输出到标准输出。

在这里插入图片描述

注意:在子进程中写入消息后,父进程才能从管道中读取消息。这保证了父子进程之间的同步通信。

对于管道通信可以看作特殊的文件,对于他的读写可以使用writeread函数进程操作但他不是普通文件,并不存在于文件系统当中,而是存在于内存当中。且数据只能被读取一次


命名管道(FIFO)

命名管道(FIFO)是管道的一种,但支持无亲缘关系的进程间通信。FIFO 在文件系统中以特殊文件形式存在,可以被多个进程打开进行读写操作。

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

函数执行成功返回0,失败则返回-1;俩个参数分别为:创建管道的路径及文件名字,和权限。
例如:mkfifo("./file",0666)
这段表示在当前文件夹(目录)下创建名字为file的管道文件,权限为0666(可读可写);

文件的权限:r 表示可读取,w 表示可写入,x 表示可执行,分别表示为数字为r=4,w=2,x=1;
权限又按用户的不同分为三类:User、Group、及Other三类用户的权限。

如,对于User用户,若拥有rw权限,则为4+2=6,所以0666中的666代表User、Group、及Other的权限分别是6,6,6,即均为rw权限。
而0666中的0代表不设置特殊的用户id,此处还可设为4,2,1,4代表具有root权限(即suid),2代表sgid,1代表sticky

用法

  1. 使用 mkfifo()mknod() 创建 FIFO 文件。
  2. 进程可以通过文件路径打开 FIFO 文件进行读写。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>int main() {const char *fifo_path = "/tmp/my_fifo";// 创建 FIFO 文件mkfifo(fifo_path, 0666);if (fork() == 0) { // 子进程int fd = open(fifo_path, O_WRONLY);write(fd, "Hello from child!", 17);close(fd);} else { // 父进程char buffer[20];int fd = open(fifo_path, O_RDONLY);read(fd, buffer, sizeof(buffer));printf("Parent received: %s\n", buffer);close(fd);}return 0;
}

在这里插入图片描述
绿色部分是因为我的buffer没有初始化所以会有乱码,可以加一个memset进行初始化一下就看不到乱码了,可以看到我在当前目录创建了一个文件my_fifo,子进程往我们的my_fifo写入了字符串,在父进程,父进程去读取,然后打印了出来。


结论

在管道操作过程中,需要注意错误处理,如处理管道创建失败、读写数据异常等情况。

对于管道的探索远不止我博客写的这些,希望以后学员们可以灵活应用这一通讯技术。通过管道,不同进程之间可以方便地进行数据交换和通信,实现更复杂的系统功能。

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

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

相关文章

阿拉伯国家本地化测试的特点

针对阿拉伯国家的应用程序的本地化测试需要详细了解语言、文化背景、地区规范和技术细节&#xff0c;以符合阿拉伯语用户的期望。这些国家包括沙特阿拉伯、阿拉伯联合酋长国、科威特、卡塔尔、巴林和阿曼&#xff0c;具有独特的语言和文化因素&#xff0c;成功地本地化测试解决…

报错:npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。

报错场景 使用npm run dev 报错 npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 字符: 1 npm…

RabbitMQ的路由模式

路由模式 队列与交换机的绑定&#xff0c;不能是任意绑定了&#xff0c;而是要指定一个 RoutingKey&#xff08;路由key&#xff09; 消息的发送方在向 Exchange 发送消息时&#xff0c;也必须指定消息的 RoutingKey Exchange 不再把消息交给每一个绑定的队列&#xff0c;而是…

FastAPI性能对比:同步vs异步

大家好&#xff0c;FastAPI已成为构建Python API的最流行框架之一&#xff0c;因其速度和易用性而广受欢迎。但在构建高性能应用程序时&#xff0c;使用同步&#xff08;sync&#xff09;还是异步&#xff08;async&#xff09;代码执行是很重要的问题。本文将通过现实世界的性…

diffusion model 学习笔记

条件引导的 diffusion 对于无条件的DDPM 而言 p ( x t ∣ x 0 ) ∼ N ( α t ˉ x 0 , 1 − α t ˉ ⋅ I ) p(x_t | x_0) \sim \mathcal{N}( \sqrt{\bar{\alpha_t}} x_0, 1-\bar{\alpha_t} \cdot \mathrm{I} ) p(xt​∣x0​)∼N(αt​ˉ​ ​x0​,1−αt​ˉ​⋅I) 可以得到…

3.4 大数据生态

文章目录 1. 数据存储1.1 Apache Hadoop - HDFS1.2 Apache HBase1.3 Apache Kudu1.4 云平台存储组件 2. 数据计算2.1 Apache Hadoop - MapReduce2.2 Apache Hive2.3 Apache Spark2.4 Apache Flink 3. 数据传输3.1 Apache Kafka3.2 Apache Pulsar3.3 Apache Flume3.4 Apache Sqo…

Community Enterprise Operating System

起源与背景 CentOS项目始于2003年&#xff0c;由一群热心的Linux用户和开发者共同发起。 它的诞生旨在为用户提供一个免费且与RHEL高度兼容的操作系统&#xff0c;满足那些希望使用RHEL的稳定性和安全性但又不想支付商业许可费用的用户和组织的需求。 CentOS社区会将Red Hat…

论文精读:PRL RuO2中不存在交错磁自旋分裂

Phys. Rev. Lett., 2024, 133, 176401. https://doi.org/10.1103/PhysRevLett.133.176401 https://mp.weixin.qq.com/s/Miv6kvT5vh-Sha1xP38YLQ 摘要节选 金红石RuO2被认为是一种潜在的d波交变磁候选材料&#xff0c;预测自旋分裂高达1.4 eV。尽管积累了理论预测和输运测量…

【GIN】go-gin 中 validator 验证功能

文章目录 前言一、基础用法二、常用字段说明常用字段说明1. required2. len3. min 和 max4. gte 和 lte 、 gt 和 lt 、ne5. oneof6. email7. url 三、示例代码运行效果 总结 前言 在 Go 中使用 Gin 框架时&#xff0c;BindJSON 可以将 JSON 请求体中的数据绑定到结构体上&…

[ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

RSTP的工作过程

RSTP简介&#xff1a; 生成树协议&#xff08;STP&#xff09;用于在网络中防止环路产生&#xff0c;但 STP 的收敛速度较慢。 RSTP&#xff08;Rapid Spanning Tree Protocol &#xff09;快速生成树协议&#xff1a;RSTP 是对 STP 的改进&#xff0c;它能在网络拓扑发生变化…

HTML 结构化标签完全指南:<html>、<head>、<body> 和布局标签 <div>、<span> 的功能及其在网页中的应用

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

php把十六进制转化成字符串 和 字符串转十六进制

最近项目中碰到需要把接收十六进制的数据&#xff0c;十六进制的数据不便阅读 方法一&#xff0c;只是不同的函数 // 十六进制转字符串 function hexToStr($hex) {$hex str_replace( , , $hex); // 去除空格$string ;for ($i 0; $i < strlen($hex) - 1; $i 2) {$st…

异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

《TCP/IP网络编程》学习笔记 | Chapter 1:理解网络编程和套接字

《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字 《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字基本概念服务端客户端 基于 Linux 平台的 "Hello world!" 服务端和客户端基于 Linux 的文件操作打开文件关闭文件…

代理人工智能如何应对现代威胁的速度和数量

Seven AI首席执行官 Lior Div 讨论了代理 AI 的概念及其在网络安全中的应用。他解释了代理 AI 与传统自动化安全系统的区别&#xff0c;即代理 AI 具有更大的自主性和决策能力。 Div 强调&#xff0c;通过实时处理大量警报&#xff0c;代理 AI 特别适合对抗现代 AI 驱动的威胁…

【华为HCIP实战课程二十九】中间到中间系统协议IS-IS邻居关系建立和LSP详解,网络工程师

一、广播环境邻居关系建立详解 1、广播环境邻居关系建立 广播邻居关系采用三次握手,携带的邻居列表为接口的MAC来标识 2、LSP同步:3种报文(CSNP和PSNP和具体的LSP) CSNP作用类似DBD,请求者发送PSNP(类似LSR)来请求具体的LSP 广播网络LSP交互过程: R1-R2(DIS)--R3…

<HarmonyOS第一课>应用/元服务上架的课后习题

善者&#xff0c;吾善之&#xff1b; 不善者&#xff0c;吾亦善之&#xff0c;德善。 信者&#xff0c;吾信之&#xff1b; 不信者&#xff0c;吾亦信之&#xff0c;德信。 圣人在天下&#xff0c;歙歙焉为天下浑其心&#xff0c;百姓皆注其耳目&#xff0c;圣人皆孩之。 通过&…

九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图

近日&#xff0c;九识智能与徐工汽车签署战略合作协议&#xff0c;标志着双方在智能驾驶技术与新能源商用车融合应用、联合生产及市场推广等方面迈入深度合作的新篇章&#xff0c;将共同引领智能驾驶技术商业化浪潮。 近年来&#xff0c;在国家智能化发展战略的引领下&#xff…

根据Redis漏洞通知的整改修复过程

一、收到通知&#xff1a; 二、查看本校“宝山商城&#xff08;教学&#xff09;”已安装的Redis版本号 对照影响范围的版本号&#xff0c;在其内&#xff0c;所以需要升级Redis版本。 三、升级centos中的Redis版本 在Cent0S系统中&#xff0c;如果我们需要升级Redis版本&…