Linux 管道

目录

一、认识管道

 二、匿名管道

pipe函数

用法:

pipefd:

匿名管道通信:

 三、命名管道

概念:

创建:

特性:

用途:

 四、命名管道和匿名管道的区别

命名:

持久性:

进程间通信:

创建方式:

权限控制:


一、认识管道

将一个进程连接到另一个进程的数据量,我们称它为管道

 在图片中who和wc是两个命令,运行后产生两个进程,who进程通过标准输出将数据送到管道中,wc进程再通过标准输入在管道中读取,数据传输完成。

who命令是查看当前云服务器的登陆用户,wc是统计当前行数

 二、匿名管道

匿名管道是一种简单而有效的进程间通信方式,特别适用于父子进程之间或者相关进程之间的数据传输。

使用匿名管道实现父子进程间通信的原理就是,让两个父子进程先看到同一份被打开的文件资源,然后父子进程就可以对该文件进行写入或是读取操作,进而实现父子进程间通信。

 注意:

  • 管道方向:匿名管道是单向的,可以用于父子进程或兄弟进程之间的通信。如果需要双向通信,需要创建两个管道。
  • 管道大小:匿名管道有固定的缓冲区大小。在写入管道时,如果写入的数据超过管道的容量,写入操作可能会阻塞或失败。因此,要确保在读取管道之前,已经将所有数据写入管道。
  • 阻塞操作:管道的读取和写入操作默认是阻塞的,即如果没有可读数据或管道已满,写入和读取操作将阻塞进程。要避免阻塞,可以使用非阻塞的I/O操作或将管道设置为非阻塞模式。
  • 进程间同步:如果多个进程同时读取或写入管道,可能会出现竞态条件。可以使用同步机制(如互斥锁或信号量)来确保进程之间的正确同步。
  • 管道的生命周期:匿名管道在父进程和子进程之间共享,但在父进程终止后,子进程仍然可以继续使用管道。确保在不再需要管道时正确关闭它们,以避免资源泄漏。

pipe函数

pipe()函数是一个在 Unix/Linux 系统中用于创建管道的系统调用。它创建一个管道,用于在两个相关的进程之间进行通信,其中一个进程作为管道的写入端,另一个进程作为管道的读取端。

用法:

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

pipefd:

在函数原型中,pipefd是一个整型数组,它有两个元素pipefd[0]表示管道的读取端、pipefd[1]表示管道的写入端。

  • pipefd[0]:读取端是一个打开的文件描述符,用于从管道中读取数据。当管道中有数据可读时,对该文件描述符的读取操作将成功,否则读取操作将阻塞
  • pipefd[1]:写入端是一个打开的文件描述符,用于向管道中写入数据。当管道的写入缓冲区未满时,对该文件描述符的写入操作将成功,否则写入操作将阻塞

(读取端):当进程从管道读取数据时,应该使用这个文件描述符。读取端是一个打开的文件描述符,用于从管道中读取数据。当管道中有数据可读时,对该文件描述符的读取操作将成功,否则读取操作将阻塞,直到有数据可读或者管道关闭。


匿名管道通信:

在创建匿名管道实现父子间通信需要fork()和pipe()搭配使用

1.父进程使用pipe创建管道

 2.父进程创建子进程

 

父进程关闭写端,子进程关闭读端 

  • 管道只能够进行单向通信,因此当父进程创建完子进程后,需要确认父子进程谁读谁写,然后关闭相应的读写端。
  • 从管道写端写入的数据会被存到内核缓冲,直到从管道的读端被读取。 

 三、命名管道

  1. 概念

    • 命名管道是一种特殊类型的文件,它允许不相关的进程之间进行通信。
    • 与匿名管道不同,命名管道是由文件系统中的路径名标识的。
  2. 创建

    • 可以使用mkfifo命令在文件系统中创建命名管道。
    • 也可以使用mkfifo()系统调用在程序中创建命名管道。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main() {char *fifo_path = "/tmp/myfifo"; // 命名管道的路径名// 使用 mkfifo() 函数创建命名管道if (mkfifo(fifo_path, 0666) == -1) {perror("mkfifo");exit(EXIT_FAILURE);}printf("Named pipe created successfully at %s\n", fifo_path);return 0;
}

  1. 特性

    • 命名管道在文件系统中以文件的形式存在,但其行为类似于管道。
    • 命名管道具有阻塞特性,当写入数据时,如果没有进程读取数据,则写入进程会被阻塞。
    • 命名管道就是一种特殊类型的文件,两个进程通过命名管道的文件名打开同一个管道文件。
    • 命名管道可以像普通文件一样设置权限,以控制哪些进程可以访问它。
    • 进程通过向命名管道写入数据,然后由另一个进程从管道读取数据来进行通信。
    • 多个进程可以同时向命名管道写入数据,但只有一个进程可以读取数据。
    • 命名管道遵循文件系统的生命周期,可以通过删除其路径名来销毁管道。
  2. 用途

    • 命名管道常用于同一主机上的不同进程之间的通信,特别是当这些进程无法通过常规IPC(Inter-Process Communication)机制通信时。
    • 它们可以在shell脚本中用作简单的IPC机制,允许不同的shell命令之间进行通信
    • 命名管道通常用于本地进程间通信,因此不适用于远程进程通信

 四、命名管道和匿名管道的区别

  1. 命名

    • 命名管道有一个在文件系统中的路径名,可以通过文件系统访问和识别。
    • 匿名管道没有在文件系统中的路径名,只能在创建它的进程内部使用。
  2. 持久性

    • 命名管道是持久的,它们在文件系统中存在,直到被显式删除。
    • 匿名管道是临时的,它们只存在于创建它们的进程的生命周期中,进程结束时管道会自动被销毁。
  3. 进程间通信

    • 命名管道允许不相关的进程之间进行通信,因为它们可以在文件系统中识别。
    • 匿名管道只适用于具有父子关系的相关进程之间的通信,因为它们是通过pipe()系统调用创建的,并且没有在文件系统中的路径名。
  4. 创建方式

    • 命名管道可以使用mkfifo命令或mkfifo()系统调用在文件系统中创建。
    • 匿名管道可以使用pipe()系统调用在内存中创建,但它们不在文件系统中可见。
  5. 权限控制

    • 命名管道可以像普通文件一样设置权限,以控制哪些进程可以访问它。
    • 匿名管道没有权限控制,只能由创建它的进程和其子进程访问。

        总的来说,命名管道和匿名管道都是进程间通信的方式,但它们的持久性、适用范围和创建方式有所不同。如果需要在不相关的进程之间进行通信,并且需要持久性,则可以选择命名管道;如果只需要在相关进程之间进行临时通信,则可以选择匿名管道。

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

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

相关文章

改进YOLOv8注意力系列六:结合SEAttention轻量通道注意力、ShuffleAttention重排特征注意力模块、SimAM无参数化注意力

改进YOLOv8注意力系列五:结合ParNetAttention注意力、高效的金字塔切分注意力模块PSA、跨领域基于多层感知器(MLP)S2Attention注意力 代码SEAttention轻量通道注意力ShuffleAttention重排特征注意力模块SimAM无参数化注意力加入方法各种yaml加入结构本文提供了改进 YOLOv8注…

大模型下载报错:aria2c/git-lfs is not installed, Please install it first.

报错信息 aria2c is not installed, Please install it first. git-lfs is not installed, Please install it first.解决方法 apt install aria2c同理 apt install git-lfs其他问题 如果是权限问题加sudo sudo apt install aria2c和 sudo apt install git-lfs

【PyQt】17-日历控件

文章目录 前言一、代码二、运行结果总结 前言 固定格式的表述 日期的获取 一、代码 #Author &#xff1a;susocool #Creattime:2024/3/19 #FileName:40-日历控件 #Description: 日历控件的展示 import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQ…

[论文笔记] Open-Sora 4、sora复现训练过程 (新repo)

sudo -H pip install --upgrade youtube-dl -i https://pypi.doubanio.com/simple/ 一、概况 OpenAI 的 Sora 在生成一分钟高质量视频方面非常出色。然而,它几乎没有透露任何有关其细节的信息。为了让AI更加“开放”,致力于打造Sora的开源版本。本报告描述了colossal-ai首次…

【云呐】医院固定资产管理系统有哪些

科学技术的进步已经渗透到各个领域&#xff0c;医疗行业也是如此。伴随着医疗信息化的实施&#xff0c;医院固定资产管理系统的应用日益广泛。那医院固定资产管理系统的作用是什么呢&#xff1f;  医院固定资产管理系统的核心功能是高效管理医院的固定资产。这包括对整个过程…

解决jenkins运行磁盘满的问题

参考&#xff1a;https://blog.csdn.net/ouyang_peng/article/details/79225993 分配磁盘空间相关操作&#xff1a; https://cloud.tencent.com/developer/article/2230624 登录jenkins相对应的服务或容器中查看磁盘情况&#xff1a; df -h在102挂载服务器上看到是这两个文件…

关于自己Nginx的使用(ant design pro 部署)

一 原因 工作需要部署 ant design pro 框架开发的前端程序&#xff0c;并且需要有用到代理。就选择了nginx部署。 二 使用nginx部署 ant design pro 框架程序 1. 前端项目打包 &#xff08;1&#xff09;打包命令&#xff1a;npm run build 或者 yarn bulid &#…

Java安全技术及代码审计技巧

概述 Java安全编码和代码审计是确保Java应用程序安全性的重要环节。本文旨在介绍Java中常见的Web漏洞、安全编码示例以及一些常见漏洞函数&#xff0c;并提供一个自动化查找危险函数的Python脚本。 1. XML外部实体 (XXE) 漏洞 介绍 XML文档结构包括XML声明、DTD文档类型定义&…

淘宝店铺如何从1688一键铺货?官方授权API接口,可满足多样化上货需求

那么新手卖家如何将1688的源头厂货一键铺货到淘宝店铺呢&#xff1f;下面我教大家几招&#xff1a; 1、通过淘宝复制一键复制上货 淘宝API接口采集 taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretStr…

PVE中 非集群环境中迁移LXC到另一台主机

需求&#xff1a;要将PVE 中LXC 容器迁移到 另一台不同网段的PVE中&#xff08;诸如模板机之类&#xff09;&#xff1b; 思路&#xff1a;源主机上备份LXC&#xff0c;在新主机上还原LXC 主机&#xff1b; 步骤&#xff1a; 1. 在源主机 备份LXC 根据自身的需求选择压缩方式…

【工具】vscode终端打不开

问题 1The terminal process failed to launch: A native exception occurred during launch (forkpty(3) failed.). 参考方案 下面参考链接是针对windows系统上vscode 出现的相同问题的解答 参考链接&#xff1a;https://blog.csdn.net/weixin_40921421/article/details/122…

强强联合!亚信科技、用友网络共同助力西南某国企集团数智化升级

近日&#xff0c;亚信科技&#xff08;中国&#xff09;有限公司&#xff08;简称“亚信科技”&#xff09;与用友网络科技股份有限公司&#xff08;简称“用友网络”&#xff09;携手推出的“U8CAntDB联合产品”正式落地西南某国企集团&#xff0c;助力该集团搭建统一的财务管…

LeetCode 35. 搜索插入位置 java题解

题目 二分查找 class Solution {public int searchInsert(int[] nums, int target) {int lennums.length;if(nums[len-1]<target)return len;if(nums[0]>target)return 0;//找到第一个不大于它的位置&#xff0c;插在它后面int left0,rightlen-1;while(left<right){i…

Linux Deepin系统安装x11vnc+cpolar实现Windows系统电脑远程其桌面

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 x11vnc是一种在Linux系统中实现远程桌面控制的工具&#xff0c;它的原理是通过X Window系统的协议来实现远程桌面的展…

MySQL中replace into详解、批量更新、不存在插入存在则更新、replace into的坑

文章目录 一、replace into原理二、replace into的三种形式三、replace into 使用案例3.1、replace into values3.1.1、只有主键且主键冲突3.1.2、有主键有唯一索引且主键冲突3.1.3、有主键有唯一索引且唯一索引冲突(有坑)3.1.4、有主键有唯一索引且与一条主键冲突与另一条唯一…

undefined symbol: _ZN4os

webrtc.node: undefined symbol: _ZN3rtc10DIGEST_MD5E_zn3 cc-CSDN博客 undefined symbol 问题解决记录(二)-CSDN博客 注意&#xff1a;如果 ldd -r test 一个进程&#xff0c;显示缺少 符号&#xff0c;那么 也有可能不是该进程缺少&#xff0c;而是它调用的so库缺少该…

ES间的导数脚本

一、同节点 from elasticsearch import Elasticsearch# 连接到源Elasticsearch集群 source_es Elasticsearch(http://127.0.0.1:9201)# 连接到目标Elasticsearch集群 target_es Elasticsearch(http://127.0.0.1:9200)# 定义源索引和目标索引 source_index t1 target_index …

开发Android Launcher的技术难点

开发Android Launcher可能会面临一些技术难点&#xff0c;以下是开发Android Launcher可能面临的一些技术难点&#xff0c;解决这些难点需要开发团队具备扎实的Android开发经验和技术水平&#xff0c;同时需要不断地进行优化和改进。北京木奇移动技术有限公司&#xff0c;专业的…

Redis缓存穿透的几种解决方案

目录 缓存穿透原理&#xff1a; 缓存穿透一般有几种解决方案&#xff1a; 1.缓存空值 2.使用锁 3.布隆过滤器 优缺点 布隆过滤器误判理解 布隆过滤器的简单使用流程 4.组合方案 那么当我们高并发的访问短链接或者人为的去穿透的时候呢&#xff1f; 最近做项目遇到了缓…

淘宝API接口开发系列——淘宝详情数据采集

淘宝详情数据采集涉及多种技术和方法&#xff0c;下面列举几种常见的方式&#xff1a; 请求示例&#xff0c;API接口接入Anzexi58 爬虫技术&#xff1a;使用编程语言&#xff08;如Python&#xff09;编写网络爬虫程序&#xff0c;通过模拟浏览器行为访问淘宝网站&#xff0c;…