[linux]:匿名管道和命名管道(什么是管道,怎么创建管道(函数),匿名管道和命名管道的区别,代码例子)

目录

一、匿名管道

1.什么是管道?什么是匿名管道?

2.怎么创建匿名管道(函数)

3.匿名管道的4种情况

4.匿名管道有5种特性

 5.怎么使用匿名管道?匿名管道有什么用?(例子)

二、命名管道

1.什么是命名管道?

2.怎么创建命名管道(函数)?

3.命名管道的打开规则

4.怎么使用命名管道?命名管道有什么用?(例子)

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


一、匿名管道

1.什么是管道?什么是匿名管道?

我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。而匿名管道顾名思义,就是一种没有名字的“管道”。

2.怎么创建匿名管道(函数)

#include <unistd.h>
功能:创建一无名管道
原型
int pipe(int fd[2]);
参数
fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端

记忆方法:0像一张嘴,所以是读端,1像一支笔,所以是写端
返回值:成功返回0,失败返回错误代码

3.匿名管道的4种情况

1.正常情况,如果管道没有数据了,读端必须等待,直到有数据为止(写端写入数据了)
2.正常情况,如果管道被写满了,写端必须等待,直到有空间为正(读端读走数据)
3.写端关闭,读端一直读取,读端会读到read返回值为0,表示读到文件结尾
4.读端关闭,写端一直写入,OS会直接杀掉写端进程,通过向目标进程发送SIGPIPE(13)信号,终止目标进程
b.管道的5种特性
1.匿名管道,可以允许具有血缘关系的进程之间进行进程间通信,常用与父子,仅限于此
2.匿名管道,默认给读写端要提供同步机制 ---了解现象就行
3. 面向字节流的---了解现象就行
4.管道的生命周期是随进程的
5.管道是单向通信的,半双工通信的一种特殊情况

4.匿名管道有5种特性

1.匿名管道,可以允许具有血缘关系的进程之间进行进程间通信,常用与父子,仅限于此
2.匿名管道,默认给读写端要提供同步机制
3. 面向字节流的
4.管道的生命周期是随进程的
5.管道是单向通信的,半双工通信的一种特殊情况

 5.怎么使用匿名管道?匿名管道有什么用?(例子)

例子:

先创建管道, 进而创建子进程, 父子进程使用管道进行通信

父进程向管道当中写“i am father”, 

子进程从管道当中读出内容, 并且打印到标准输出(屏幕)

#include <unistd.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
    int fd[2];
    //打开匿名管道
    if(pipe(fd) == -1)
    {
        cout << "open pipe fail" << endl;
        exit(1);
    }
    pid_t id = fork();
    if(id == 0)//child
    {
        char message[30];
        read(fd[0], message, sizeof(message));

        cout << message << endl;
    }
    //father
    char s[] = "i am father";
    write(fd[1], s, sizeof(s));

    return 0;
}

运行后:

二、命名管道

1.什么是命名管道?

匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信

如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件。

2.怎么创建命名管道(函数)?

命名管道可以从命令行上创建,命令行方法是使用下面这个命令

mkfifo filename

命名管道也可以从程序里创建,相关函数有 

#include <sys/types.h>

#include <sys/stat.h>

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

filename:命名管道的名字

mode:权限值

返回值:成功返回0,失败返回-1

3.命名管道的打开规则

如果当前打开操作是为读而打开FIFO时

  • O_NONBLOCK (disable):阻塞直到有相应进程为写而打开该FIFO
  • O_NONBLOCK (enable):立刻返回成功

如果当前打开操作是为写而打开FIFO时

  • O_NONBLOCK (disable):阻塞直到有相应进程为读而打开该FIFO
  • O_NONBLOCK (enable):立刻返回失败,错误码为ENXIO


4.怎么使用命名管道?命名管道有什么用?(例子)

创建出来的命名管道可以供两个进程通信

进程A 向管道当中写 “i am process A”

进程B 从管道当中读 并且打印到标准输出

processA.cc

#include "fifo.h"
using namespace std;
bool MakeFifo()
{
    int n = mkfifo(FIFONAME, 0644);
    if(n < 0)
    {
        cout << "mkfifo fail" << endl;
        return false;
    }
    return true;
}

int main()
{
    //创建命名管道
    if(!MakeFifo())
    {
        cerr << "mkfifo fail" << endl;
        return 1;
    }
    //打开fifo文件写
    int wfd = open(FIFONAME, O_WRONLY);
    if(wfd < 0)
    {
        cerr << "open fifo fail" << endl;
        return 2;
    }
    cout << "Process A is sending a message to process B" << endl;
    char message[] = "i am process A";
    write(wfd, message, sizeof(message));

    return 0;
}

processB.cc

#include "fifo.h"
using namespace std;

int main()
{
    //打开fifo文件写
    int rfd = open(FIFONAME, O_RDONLY);
    if(rfd < 0)
    {
        cerr << "open fifo fail" << endl;
        return 2;
    }
    cout << "receives messages from process A: ";
    char message[30];
    read(rfd, message, sizeof(message));
    
    cout << message << endl;
    
    return 0;
}

fifo.h

#include <sys/types.h>
#include <sys/stat.h>
#include <iostream>
#include <cassert>
#include <fcntl.h>
#include <unistd.h>

#define FIFONAME  "fifo"

现象:

1.

 2.

 3.

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

  • 匿名管道由pipe函数创建并打开。
  • 命名管道由mkfifo函数创建,打开用open
  • FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义

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

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

相关文章

机器人运动学林沛群——旋转矩阵

旋转矩阵 基本概念 三个主轴&#xff0c;可以看作是三个向量&#xff0c;为b在a的表达&#xff0c;以a为基准 旋转矩阵 B相对于A的姿态&#xff1a; B A R [ A X B ^ A Y B ^ A Z B ^ ] [ X ^ B ⋅ X ^ A Y ^ B ⋅ X ^ A Z ^ B ⋅ X ^ A X ^ B ⋅ Y ^ A Y ^ B ⋅ Y ^ A Z …

部署一个自己的P站

效果 安装 1.拉取代码 cd /opt git clone https://gitee.com/WangZhe168_admin/logoly.git 2.安装依赖 cd logoly npm install 3.启动 npm run serve 愉快地使用吧

删除和清空Hive外部表数据

外部表和内部表区别 未被external修饰的是内部表&#xff08;managed table&#xff09;&#xff0c;被external修饰的为外部表&#xff08;external table&#xff09;&#xff1b; 区别&#xff1a; 内部表数据由Hive自身管理&#xff0c;外部表数据由HDFS管理&#xff1b; …

【网站项目】031网络游戏公司官方平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

详解计算机软件基本概念

软件基本概念 软件的定义 一个完整的计算机系统是由硬件系统和软件系统协同工作来完成某一给定的任务的。 只有硬件的计算机称为裸机&#xff0c;裸机必须安装了计算机软件后才可以完成各项任务。 从广义地讲&#xff0c;软件是指计算机程序、数据以及开发、使用和维护程序…

初识 Protobuf 和 gRpc

初步了解 Protobuf 和 gRpc Protocol Buffers Protocol Buffers&#xff08;又称protobuf&#xff09;是谷歌的语言无关、平台无关、可扩展的机制&#xff0c;用于序列化结构化数据。您可以在protobuf的文档中了解更多关于它的信息。 ProtoBuf 的定义 ProtoBuf是将类的定义…

如何在Linux上部署1Panel运维管理面板并实现无公网ip远程访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

【大数据】Flink on YARN,如何确定 TaskManager 数

Flink on YARN&#xff0c;如何确定 TaskManager 数 1.问题2.并行度&#xff08;Parallelism&#xff09;3.任务槽&#xff08;Task Slot&#xff09;4.确定 TaskManager 数 1.问题 在 Flink 1.5 Release Notes 中&#xff0c;有这样一段话&#xff0c;直接上截图。 这说明从 …

【lesson48】进程通信之system V(信号量)

文章目录 信号量理解 信号量理解 为了进程通信—>我们需要让不同的进程看到同一份资源---->我们之前讲的所有通信方式&#xff0c;本质都是优先解决一个问题&#xff1a;让不同的进程看到同一份资源。 让不同的进程看到了同一份资源&#xff0c;但是也带来了一些问题&a…

nacos安装手册

1. 单机模式 1.1 准备安装介质 nacos-server-2.1.1.tar.gz1.2 环境准备 1台服务器安装JDK 1.8 1.3 解压 tar-zxvf nacos-server-2.1.1.tar.gz1.4 启动 进入解压的nacos目录&#xff0c;进入bin目录&#xff0c;运行&#xff1a; ./startup.sh -m standalone1.5 验证 na…

Markdown:简洁高效的文本标记语言

引言 在当今信息爆炸的时代&#xff0c;我们需要一种简洁、高效的文本标记语言来排版和发布内容。Markdown应运而生&#xff0c;它是一种轻量级的文本标记语言&#xff0c;以其简单易学、易读易写的特点&#xff0c;成为了广大写作者的首选工具。本文将介绍Markdown的语法优缺…

如何修复Mac的“ kernel_task” CPU使用率过高的Bug?

当计算机开始缓慢运行时&#xff0c;这从来都不是一件有趣的事情&#xff0c;但是当您弄不清它为何如此缓慢时&#xff0c;甚至会变得更糟。如果您已经关闭了所有程序&#xff0c;并且Mac上的所有内容仍然感觉像是在糖蜜中移动&#xff0c;这可能是令人讨厌的kernel_task导致高…

物理信息神经网络(PINN): 将物理知识融合到深度学习中

物理信息神经网络&#xff08;PINN&#xff09;: 将物理知识融合到深度学习中 物理信息神经网络&#xff08;PINN&#xff09;简介PINN的工作原理PINN模型如何利用物理法则指导模型训练1. 定义物理问题和相应的物理定律2. 构建神经网络3. 定义损失函数数据误差项 (Data-fidelit…

C语言--------指针(1)

0.指针&指针变量 32位平台&#xff0c;指针变量是4个字节&#xff08;32bit/84)--------x86 64位平台&#xff0c;指针变量是8个字节&#xff08;64bit/88)--------x64 编号指针地址&#xff1b;我们平常讲的p是指针就是说p是一个指针变量&#xff1b; ************只要…

【Java多线程案例】单例模式

1. 单例模式概念 设计模式&#xff1a;谈到单例模式&#xff0c;我们首先需要知道什么是设计模式&#xff0c;设计模式是软件工程中的一大重要概念&#xff0c;是被广泛认可并使用于解决特定实际问题的代码设计经验&#xff0c;校招中常考的设计模式有单例模式、工厂模式 等&a…

Linux学习笔记(centOS)—— 文件系统

目录 一、Linux中的文件 打开方式 二、目录结构​ 三、相关命令 切换目录命令 列出当前目录下的文件和目录命令 一、Linux中的文件 “万物皆文件。” 图1.1 所有文件 打开方式 图形化界面左上角的位置→计算机&#xff0c;打开以后就可以看到Linux全部的文件了&#xf…

Linux第43步_移植ST公司uboot的第4步_uboot测试

uboot移植结束后&#xff0c;需要进行测试。 1、烧录程序 1)、将STM32MP157开发板的网络接口与路由器的网络接口通过网线连接起来。 2)、将开发板的串口和电脑通过USB线连接起来。 3)、将开发板的USB OTG接口和电脑通过USB线连接起来。 4)、将开发板上拨码开关拨到“000”…

nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法

1、我们知道 nodeJS 是老外搞出来的&#xff0c;服务器放在了国外&#xff0c;国内的小朋友访问起来会比较慢&#xff0c;阿里巴巴的淘宝给出了有力支持&#xff0c;现在我们就将 nodeJS 的镜像地址切换为国内的淘宝镜像。 2、查看当前的镜像地址&#xff1a; npm get registr…

前端学习之路(6) npm详解

npm 是什么&#xff1f; npm&#xff08;node package manager&#xff09;&#xff1a;node.js 的包管理器&#xff0c;用于node插件管理&#xff08;包括安装、卸载、管理依赖等&#xff09; &#xff0c;npm 是随同 node.js 一起安装的包管理工具&#xff0c;能解决 node.j…

HTTP2:netty http2 StreamChannel多流实现与Http2StreamFrame解码器的源码分析

netty http2 server侧的核心逻辑个人认为&#xff0c;主要在编解码处理器和Stream Transform Channel这块&#xff0c;分别处理Http2 消息帧的编解码&#xff0c;以及连接的多流处理机制。对应用的处理类分别&#xff1a; ChannelHandlerDescio.netty.handler.codec.http2.Htt…