Linux 管道

news2024/9/28 5:27:57

目录

一、认识管道

 二、匿名管道

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.coloradmin.cn/o/1516986.html

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

相关文章

MySQL:概念简章

1.SQL通用语法 SQL单行、多行书写&#xff0c;以分号结尾SQL可以以空格有缩进增加代码可读性SQL语句不区分大小写 2.SQL语句分类 2.1 DDL&#xff08;数据定义语言&#xff09; 用于数据库、数据表、字段的定义的语言 create by 表名 &#xff08;表里有什么字段&#xff09;…

力扣经典题:化栈为队

整体思路&#xff1a;入栈然后出栈&#xff0c;操作就和队列相同了 大佬的代码 typedef struct Node {int val;struct Node* next; }Node; Node* newNode(int Val) {Node* n(Node*)malloc(sizeof(Node));n->valVal;n->nextNULL;return n; } void push(Node* Head,int Va…

怎么把mp4转换成amv格式?如何下载amv格式视频?

MP4&#xff08;MPEG-4 Part 14&#xff09;是一种通用的视频文件格式&#xff0c;广泛用于多媒体应用。作为MPEG-4标准的一部分&#xff0c;MP4以其卓越的压缩性能、出色的视频质量和广泛的兼容性成为当前最流行的视频格式之一。 AMV文件格式的介绍 AMV文件格式起源于中国公司…

c语言大小写字母的转换

通过ascll码表我们可以知道大写字母与小写字母相差32个数&#xff08;小写字母比大写字母大&#xff09;。因此&#xff0c;通过相加减32即可转换大小写字母。 #include <stdio.h>int main() {char ch c;char CH A;printf("%c\n", ch - 32);printf("%c…

网工内推 | 上市公司网工,IE认证优先,最高18K*13薪,包吃住

01 深圳市宝腾互联科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、是整个数据中心的网络技术及安全问题的负责人&#xff0c;确保数据中心业务的正常进行&#xff1b; 2、负责规划、设计、搭建、维护数据中心的网络环境&#xff0c;确保IDC /云平台&a…

【Qt】常用控件或属性(1)

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、控件button、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结…

第五十五天| 583. 两个字符串的删除操作、72. 编辑距离

Leetcode 583. 两个字符串的删除操作 题目链接&#xff1a;583 两个字符串的删除操作 题干&#xff1a;给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 思考&#xff1a;动态规划。本题中…

现已修复!微软 SmartScreen 漏洞被用于分发 DarkGate 恶意软件

昨天&#xff08;3月13日&#xff09;&#xff0c;趋势科技分析师报告称有黑客利用Windows SmartScreen 漏洞在目标系统投放DarkGate 恶意软件。 该漏洞被追踪为 CVE-2024-21412 漏洞&#xff0c;是一个 Windows Defender SmartScreen 漏洞&#xff0c;它允许特制的下载文件绕…

Self-supervised Contextual Keyword and Keyphrase Retrieval with Self-Labelling

文章目录 题目摘要方法数据集实验 题目 通过自我标记进行自我监督的上下文关键字和关键词短语检索 论文地址&#xff1a;https://www.preprints.org/manuscript/201908.0073/v1 项目地址&#xff1a;https://github.com/naister/Keyword-OpenSource-Data 摘要 在本文中&#x…

SE园区综合实验(未补齐版)

实验要求&#xff1a; 1.局域网存在vlan10和vlan20两个业务vlan&#xff0c;ip网段分别对应192.168.1.0/24和192.168.2.0/24 2.业务vlan可以在所有链路上传输数据 3.sw1和sw2之间的直连链路上配置静态链路聚合实现链路冗余&#xff0c;并提高链路带宽 4.sw3为某接入点二次交…

【教学类-34-11】20240314 动物拼图(Midjounery生成线描图,8*8格拼图块 A4整张)(AI对话大师)

作品展示&#xff1a;——A4整页&#xff08;一人2张纸&#xff09; 背景需求&#xff1a; 通过春天拼图的个别化实验&#xff0c;我发现&#xff1a; 【教学类-34-10】20240313 春天拼图&#xff08;Midjounery生成线描图&#xff0c;4*4格拼图块&#xff09;&#xff08;AI…

单例模式( Singleton)——创建型模式

单例模式——创建型模式 什么是单例模式&#xff1f; 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。简单来说如果你创建了一个对象&#xff0c; 过一会儿后你决定再创建一个新对象&#xff0c; 此…

【Memcached】

memcached 有一个很大的缺陷不能持久化&#xff0c;不能存储在硬盘里 1.NoSQL介绍 NoSQL是对 Not Only SQL、非传统关系型数据库的统称。 NoSQL一词诞生于1998年&#xff0c;2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。 随着互联网时代的到…

Node.js 学习笔记 fs、path、http模块;模块化;包;npm

Node.js学习 Node.js一、定义1.前端工程化2.Node.js 为何能执行 JS&#xff1f;3.安装nodejs、删除之前的nodejs4.使用 Node.js 二、fs模块 \- 读写文件三、path 模块案例 - 压缩前端html四、HTTP相关URL中的端口号常见的服务程序http 模块-创建 Web 服务案例&#xff1a;浏览时…

【Flutter 面试题】Flutter如何处理响应式布局?

【Flutter 面试题】Flutter如何处理响应式布局&#xff1f; 文章目录 写在前面口述回答补充说明完整代码示例运行结果详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&am…

windows下安装python3.8

一、从官网下载安装包 官网地址&#xff1a;https://www.python.org/downloads/ 华为云地址&#xff1a;https://mirrors.huaweicloud.com/python/ 第三方镜像&#xff1a;https://registry.npmmirror.com/binary.html?pathpython/ 注意&#xff1a;从python3.8.10版本开始…

注意!运用表单流程管理可一起实现提质增效

经常会有客户在我们面前抱怨&#xff1a;到底用什么样的方法和软件&#xff0c;才能实现高效率的办公&#xff1f;其实&#xff0c;大家不必苦恼。因为低代码技术平台服务商流辰信息将会给大家推荐表单流程管理的实用性&#xff0c;它的灵活简便、易操作等优势特点&#xff0c;…

C#文件交互

C#是一种流行的编程语言&#xff0c;广泛应用于开发各种类型的应用程序&#xff0c;包括需要进行文件交互的应用程序。文件交互是指应用程序与计算机文件系统进行交互&#xff0c;包括读取、写入、创建、删除和修改文件等操作。在C#中&#xff0c;文件交互通常通过.NET框架提供…

格子表单GRID-FORM | 必填项检验 BUG 修复实录

格子表单/GRID-FORM已在Github 开源&#xff0c;如能帮到您麻烦给个星&#x1f91d; GRID-FORM 系列文章 基于 VUE3 可视化低代码表单设计器嵌套表单与自定义脚本交互文档网站搭建&#xff08;VitePress&#xff09;与部署&#xff08;Github Pages&#xff09;必填项检验 BUG…

打卡学习kubernetes——了解五种控制器类型

目录 1 Deployment控制器 2 StatefulSet控制器 3 DaemonSet控制器 4 Job控制器 5 CronJob控制器 1 Deployment控制器 Deployment为Pod和Replica Set&#xff08;下一代Replication Controller&#xff09;提供声明式更新。 Deployment运行无状态应用&#xff0c;一般情况…