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.hqwc.cn/news/541187.html

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

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Refresh)

可以进行页面下拉操作并显示刷新动效的容器组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 从API version 11开始&#xff0c;Refresh子组件会跟随手势下拉而下移…

Autosar教程-Mcal教程-Lin配置教程

3.7LIN配置、生成 3.7.1 配置通用设置 3.7.2 配置Dem参数 3.7.3 配置Lin通道 3.7.4配置生成命令 参照Dio生成命令方法&#xff0c;创建Lin生成命令&#xff0c;创建完成后按下面提供的信息配置生成命令。 实际上MCAL代码并不能单独生成&#xff0c;它需要和BSW的配置文件一…

企业如何高效管理微信里的客户?

对于企业来说&#xff0c;懂得高效管理微信列表的客户是非常重要的一件事&#xff0c;只有把客户管理好了&#xff0c;才能更好地提高客户的满意度和忠诚度&#xff0c;我们的销售业务才能顺利进行。 那么&#xff0c;应该怎样管理才能算是高效管理呢&#xff1f;下面就给大家…

DLL修复,快速补救带来了文件丢失问题,完美解救计算困境!

动态链接库&#xff08;DLL&#xff09;文件在Windows操作系统中扮演着重要角色&#xff0c;它们允许多个程序共享同一个功能或信息&#xff0c;从而节省系统资源并简化编码。但是&#xff0c;当DLL文件发生错误时&#xff0c;它可能导致软件崩溃或无法正常工作。在本文中&…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

一文轻松学会远程服务器/docker内 vscode,调试(debug)无/多参数/bash以及多工作空间运行的python程序,欢迎大佬补充,一起学习

至于如何SSH、docker以及无需参数的程序调试这篇就先不说了。本篇文章主要记录一下多参数和多工作空间调试的问题。 一、launch.json文件 如上图所示&#xff0c;正常情况下当我们想要调试项目名字为0的目录下的train.py文件时&#xff0c;我们会按顺序点1&#xff0c;2&#…

labview技术交流-判断两个数组的元素是否完全相同

问题来源 分析并判断两个一维数组中包含的元素是否完全相同&#xff0c;不考虑索引顺序。比如说[1,5,7,3]和[3,5,7,1]是完全相同的两个一维数组&#xff0c;那[1,5,7,3]和[5,7,1,4]就不是相同的数组。结合我给出的示例&#xff0c;大家有没有什么思路呢&#xff1f; 思路分析 …

探秘Kafka位移在消息旅程中的神奇

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘Kafka位移在消息旅程中的神奇 前言什么是消费者位移消费者位移的定义和作用&#xff1a;消费者位移对于消息传递的一致性至关重要的原因&#xff1a; 位移的存储方式位移信息的存储方式&#xff1…

面试相关问题准备

一.MySql篇 1优化相关问题 1.1MySql中如何定位慢查询&#xff1f; 慢查询的概念&#xff1a;在MySQL中&#xff0c;慢查询是指执行时间超过一定阈值的SQL语句。这个阈值是由long_query_time参数设定的&#xff0c;它的默认值是10秒1。也就是说&#xff0c;如果一条SQL语句的执…

智能测径仪和普通测径仪的对比

关键字&#xff1a;智能测径仪&#xff0c;普通测径仪&#xff0c;高精度测径仪&#xff0c;单轴测径仪&#xff0c;双轴测径仪&#xff0c;普通测径仪&#xff0c; 智能测径仪和普通测径仪相比&#xff0c;具有以下显著的优势&#xff1a; 高精度测量&#xff1a;智能测径仪采…

学会这些指令,轻松上手Linux!

一、 Linux简介 Linux是一种开源的类Unix操作系统。它的核心是Linux内核&#xff0c;而用户空间则由GNU项目提供的工具和其他软件组成&#xff0c;因此常常被称为GNU/Linux。 Linux操作系统的特点包括稳定性、安全性、多用户支持和多任务处理能力&#xff0c;因此被广泛应用于…

node:internal/crypto/hash:69 this[kHandle] = new _Hash(algorithm, xofLen);

npm 打包报错 原因就是npm版本太高了&#xff0c;用的18版本&#xff0c;切换成16版本就好了。