Linux应用开发(8):Linux进程间通信(IPC):管道

Linux应用开发(7):Linux进程间通信(IPC):POSIX消息队列icon-default.png?t=N7T8https://blog.csdn.net/tecsai/article/details/137879465

1. 简述

        我们在前面已经介绍了进程间通信(IPC)常用的“消息队列”。本节将讲解另外一种常用的IPC机制,我们称作管道

        管道可以理解为一种特殊的文件,也可以理解为一种特殊的缓冲区,它允许两个进程通过一个半双工的通道进行数据通信。

2. 基本概念

        上面提到,管道是半双工的,数据只能向一个方向流动。在使用过程中,需要双方同时打开(也可以由父进程先打开,再由子进程继承)。管道分为无名管道和命名管道。

无名管道

        无名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程),它之所以成为无名管道,是因为它们不需要文件系统中的文件支持。管道的缓冲区是有限的。

命名管道

        相对于无名管道,命名管道是基于特殊的文件来进行通信的。在使用时,首先需要文件系统中有一个路径和名称,因此命名管道是可以允许不相关的进程进行通信。

3. 无名管道

        无名管道顾名思义,是没有被命名的管道,其存在于内存中,仅允许相关的两个进程间进行通信。

PS:可以联想到无名信号量和有名信号量,前者在内存中,仅允许关联进程同步,后者则可以在不相关联的进程间进行同步。

        无名管道的创建采用如下API。

#include <unistd.h>

int pipe(int fd[2]);

        fd 是一个整型数组,包含两个元素:fd[0] 用于读取,fd[1] 用于写入。

        无名管道例程。

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/wait.h>


int main(int argc, char* argv[])

{

    int fds[2];

    pid_t pid;

    char buffer[50];

    if (pipe(fds) == -1) {

        perror("pipe");

        exit(EXIT_FAILURE);

    }

    /** 创建进程. */

    pid = fork();

    if (pid == -1) {

        perror("fork");

        exit(EXIT_FAILURE);

    }

    if (pid == 0) {

        /** 子进程:写入管道. */

        close(fds[0]); ///< 关闭读端

        write(fds[1], "Hello, Parent!", 15);

        close(fds[1]); ///< 写入后关闭写端

    } else {

        /** 父进程:读取管道。 */

        wait(NULL); ///< 等待子进程结束

        close(fds[1]); ///< 关闭写端

        read(fds[0], buffer, 50);

        close(fds[0]); ///< 读取后关闭读端

        printf("Parent Process: %s\n", buffer);

    }

    return 0;

}

4. 命名管道

        命名管道(FIFO)是一种特殊的文件,它允许不相关的进程通过一个命名的路径进行通信。与无名管道不同,命名管道在文件系统中有一个路径和名称。

        创建命名管道的API如下。

#include <sys/stat.h>

int mkfifo(const char *path, mode_t mode);

命名管道例程。

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/stat.h>


int main(int argc, char* argv[])

{

    /** 文件路径. */

    const char *fifo_name = "my_fifo";

    int fd;

    /** 创建命名管道. */

    if (mkfifo(fifo_name, 0666) == -1) {

        perror("mkfifo");

        exit(EXIT_FAILURE);

    }

    /** 打开命名管道进行写入. */

    fd = open(fifo_name, O_WRONLY);

    if (fd == -1) {

        perror("open");

        exit(EXIT_FAILURE);

    }

    /** 写入命名管道. */

    write(fd, "Hello, through FIFO!", 20);

    close(fd);

    /** 清理命名管道. */

    unlink(fifo_name);

    return 0;

}

5. 什么时候选择使用管道

父子进程通信:在C++程序中,你可能需要创建子进程来执行特定的任务。管道可以用来在父进程和子进程之间安全地交换数据。

进程生成和过滤:如果你的应用程序需要生成大量的数据,并且这些数据需要被另一个进程即时处理或过滤,管道可以有效地连接生成器和消费者。

并行处理:在需要并行处理任务时,可以通过管道将任务的输出传递给其他进程,这些进程可以并行地处理数据。

后台任务处理:当你需要在后台运行一个任务,并且不希望阻塞主进程时,可以使用管道来与后台任务通信。

日志记录:管道可以用于实现日志系统,其中一个进程负责记录日志信息,而另一个进程负责监控和处理这些日志。

信号传递:在多进程程序中,管道可以用来传递信号,如通知其他进程某个事件已经发生。

资源共享:当多个进程需要访问同一个资源,但又需要协调访问以避免冲突时,可以使用管道来控制对资源的访问。

简化线程使用:在某些情况下,使用管道进行进程间通信比使用线程更简单,尤其是在涉及复杂同步和锁管理的场景中。

跨平台兼容性:如果你的C++应用程序需要在不同的操作系统上运行,使用管道可以提高代码的可移植性。

模块化设计:在构建模块化的C++应用程序时,管道可以帮助你将不同的功能模块化为独立的进程,并通过管道进行通信。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 逻辑运算符

本文 我们来说 逻辑运算符 有时做出决策需要测试多个条件&#xff0c;C语言提供了用于将简单条件组合成复杂条件的逻辑运算符。 逻辑运算符 如下图 用逻辑运算符连接操作数组成的表达式称为逻辑表达式。 逻辑运算的结果只有0和1 逻辑运算的对象可以是任意数值型&#xff0c;但…

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中&#xff0c;会经常发布一些链接图标&#xff0c;该图标基本上以模板背景为主&#xff0c;并填充项目文字内容。解决方式一般会让美工进行制作…

SL7220线性降压恒流3.6A 外围只需两个电阻 耐压40V汽车大灯IC

概述&#xff1a; SL7220 是一款双路线性降压LED恒流驱动器&#xff0c;外围只需两个电阻&#xff0c;输出电流10MA-3600MA。 SL7220 内置过热保护功能&#xff0c;内置输入过压保护功能。 SL7220 静态电流典型值为120uA。 特点 ●输入电压范围&#xff1a;2.5V-40V ●电…

Rokid AR Lite空间计算套装发布,中国空间计算踏上差异化领先之路

动动手指、动动眼睛就可以“操控一切”&#xff0c;这种颇具科幻感、未来感的交互方式&#xff0c;令许多人感叹“未来已来”。而这令人震撼的变革背后&#xff0c;正是空间计算技术的迅猛崛起与广泛应用&#xff0c;使得这种曾经只存在于想象中的交互方式&#xff0c;如今正逐…

超分中使用的损失函数和经典文章

损失函数 https://towardsdatascience.com/super-resolution-a-basic-study-e01af1449e13 在GAN出现之前&#xff0c;使用的更多是MSE&#xff0c;PSNR,SSIM来衡量图像相似度&#xff0c;同时也使用他们作为损失函数。 MSE 表面上MSE直接决定了PSNR&#xff0c;MSE&#xff…

html接入高德地图

1.申请key key申请地址&#xff1a;https://console.amap.com/dev/key/app 官方文档 https://lbs.amap.com/api/javascript-api-v2/summary 2.html接入示例 需要将YOUR_KEY替换成自己的key <!doctype html> <html> <head><meta charset"utf-…

2024年上海中考数学模拟题和答案,由过去十年真题随机组卷

还有不到两个月就是上海中考了&#xff0c;为了帮助孩子们更好地准备&#xff0c;好真题网把整理了过去十年的中考数学题真题&#xff0c;做成了在线试卷&#xff0c;便于孩子便捷地反复练习。吃透真题及其背后的知识点&#xff0c;是备考各种考试最科学、高效的方法&#xff0…

端午新疆自驾游招募

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 端午节快到了&#xff0c;我计划带队开启【新疆喀什】旅拍摄影小团。让我这个新疆人带你去新疆赏美景、拍美片和吃美食。 出行时间是6.6-6.11日&#xff0c;为期6天。 为了保证良好的出行体验&#xff0c;这次团队招募人数…

Vue+OpenLayers7入门专栏目录,OpenLayers7中文文档,OpenLayers7中文手册api,OpenLayers7中文教程

返回入门到实战汇总目录&#xff1a;汇总目录 前言 本篇作为《VueOpenLayers7入门教程》所有文章的二合一汇总目录&#xff0c;方便查找。 本专栏源码是由OpenLayers7.x版本结合Vue框架编写。本专栏基本上每章都有详细的源代码和运行示例以供参考&#xff0c;且保证每章代码都…

【论文精读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

每日学习笔记:C++ STL算法之容器元素排序

目录 常规排序 升序排序&#xff1a; sort(beg, end) stable_sort(beg, end, op) 自定义规则排序&#xff1a; sort(beg, end, op) stable_sort(beg, end, op) 局部排序(使前段有序) partial_sort(beg, sortEnd, end) partial_sort(beg, sortEnd, end, op) 复制并局…

【C++】日期类Date(详解)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 日期类 日期类实现地图 获取某年某月的天数&#xff1a;GetMonthDay 检查日期合法&#xff0c;构造函数&#xff0c;拷贝构造函数&#xff0c;赋值运算符重载及析构函数…

2. uni-app的一些介绍

前言 就目前的前端生态而言&#xff0c;跨端开发基本算是每一个前端开发者必备的技能点之一了&#xff0c;而在Vue这个技术栈里uni-app在跨端是独一档的&#xff0c;不信的话可以翻翻Boss之类的招聘网站.... 概述 阅读时间&#xff1a;约5~10分钟&#xff1b; 本文重点&…

linux的编译器vim

vim简介 之前我们在win下写代码&#xff0c;都是下载一些编译器VS/eclipse等 他们不仅可以写代码&#xff0c;还可以实现代码的运行调试&#xff0c;开发。这样的编译器叫做集成编译器 而linux中虽然也有这样的编译器&#xff0c;但不管是从下载&#xff0c;还是使用中都会显…

谷歌地球引擎Google Earth Engine下载数字高程模型DEM数据的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;批量下载指定时间与空间范围内的数字高程模型&#xff08;DEM&#xff09;数据的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;系列…

UltraScale+的40G/50G Ethernet Subsystem IP核使用

文章目录 前言一、设计框图二、模块说明三、上板3.1、发送端3.1、接收端 四、总结 前言 上文介绍了10G/25G Ethernet Subsystem IP核使用&#xff0c;本文将在此基础上介绍40G/50G Ethernet Subsystem IP核的使用&#xff0c;总体区别不大。 一、设计框图 由于40G以太网需要…

嵌入式 - i.MX93 Evaluation Kit介绍

MCIMX93-EVK (i.MX 93 APPLICATIONS PROCESSOR) 1, Out of the Box [ 开箱 ] Top view i.MX 93 11x11 EVK board Back view: Board kit contents: (board, power supply, cable, software, Documentation) MCIMX93-EVK board assembled with two separate boards, MCIMX93-SOM…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制伊甸火山3D网格曲面图

11.4.2小节我们使用3D曲面图可视化分析伊甸火山数据&#xff0c;本小节我们采用3D网格曲面图可视化分析伊甸火山数据&#xff0c;以展示其地形&#xff0c;具体示例代码如下。 购书地址&#xff1a;https://item.jd.com/14102657.html

RabbitMQ项目实战(一)

文章目录 RabbitMQ项目实战选择客户端基础实战 前情提要&#xff1a;我们了解了消息队列&#xff0c;RabbitMQ的入门&#xff0c;交换机&#xff0c;以及核心特性等知识&#xff0c;现在终于来到了激动人心的项目实战环节&#xff01;本小节主要介绍通过Spring Boot RabbitMQ S…

HackMyVM-Hommie

目录 信息收集 arp nmap WEB web信息收集 dirsearch ftp tftp ssh连接 提权 系统信息收集 ssh提权 信息收集 arp ┌──(root㉿0x00)-[~/HackMyVM] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 08:00:27:77:ed:84, IPv4: 192.168.9.126 Starting arp-…