进程间通信--命名管道

windows进程间通信系列 第三篇 匿名管道与命名管道 剪贴板的话只能实现本机上进程之间的通信,而邮槽的话虽然是可以实现跨网络之间的进程的通信,但麻烦的是邮槽的服务端只能接收数据,邮槽的客户端只能发送数据,太悲剧了,而对于匿名管道的话,其也只能实现本机上进程之间的通信,你要是能够实现本机进程间的通信也就算了,关键是它还只用来实现本地的父子进程之间的通信,也太局限了吧?而这里介绍的这个命名管道的话,就和他们有些不同了,在功能上也就显得强大很多了,至少其可 阅读详情
几个术语
  • 二义性:当我们往一个管道里面写端写数据的时候,比如写一个hello的时候,当我们写到he的时候,读端就已经开始读取数据了,所以这是不对的,这就是二义性
  • 临界资源:多个流可以访问的一个共同的存储资源
  • 临界区:访问临界资源的代码叫做临界区
  • 互斥:任一时候只能有一个进程利用临界资源访问临界区,并且是以原子性访问
  • 原子性:要么访问,要么没有访问,不存在正在访问的情况
  • 饥饿问题:一个进程因为级别低,在某些场景之下要求访问某一资源的时候一直访问不了,这就出现了饥饿问题
  • 同步:按照某一顺序访问临界资源

命名管道

命名管道的概念

匿名管道(pipe)的一个不足之处就是,匿名管道只能用于具有血缘关系的进程之间的通信,但是进程间通信的时候有很多时候都不是具有血缘关系的,这个时候就需要其他的一些通信方式,然后就有了命名管道。 命名管道通过一个路径将各个进程相连,只要一个进程能够访问某一个路径就能够访问这个管道了

命名管道的创建和读写

在shell下面我们可以使用mknod和mkfifo来创建管道

这里我们经常使用的是mkfifo,所以只是简单的介绍一个mkfifo,另一个就不做详细的介绍了
我们在shell下可以使用mkfifo myfifo.pipe来创建一个命名管道,然后在记住他的路径,在使用的时候,我们可以直接通过open来打开一个管道进行读写的 操作

下面的是程序中使用的mkfifo函数,先看接口原型

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *filename, mode_t mode);

解释一些返回值和参数,创建成功返回0,失败返回-1。
参数中const char *filename,就是一个路径加上文件名的形式,mode_t mode是我们创建的这个管道的操作权限,我们可以是设置为0666 | S_IFIFO,如下的使用方式,其中的S_IFIFO是一个固定的操作命名管道的一种方式,这里先不用管   

我们在函数中可以按照如下的使用

if(fifo("./pipe",0666 | S_IFIFO) < 0)
{
    printf("fifo error");
    return 1;
}

下面我们通过一个简单的程序实现一个写端,一个读端的操作,这个时候我们可以打开两个终端,分别运行下面的程序,就会实现进程间通信,一个写,一个读

写 端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#define _PATH_ "/home/xiaoxu/code/fifo/log.pipe"

int main()
{
    umask(0);
    if(mkfifo(_PATH_,0666|S_IFIFO) < 0 )
    {
        printf("fifo error\n");
        return 1;
    }
    int fd = open(_PATH_,O_WRONLY);
    if(fd <= 0)
    {
        printf("open error\n");
        return 1;
    }
    else
    {
        char buf[100];
        memset(buf,'\0',sizeof(buf));
        while(1)
        {
            scanf("%s",&buf);
            int wr = write(fd,buf,sizeof(buf));
            if(wr <= 0)
            {
                printf("write error\n");
                break;
            }
        }

    }
    close(fd);
    return 0;
}

读端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#define _PATH_ "/home/xiaoxu/code/fifo/log.pipe"

int main()
{
    int fd = open(_PATH_,O_RDONLY);   //只读方式打开一个管道
    if(fd < 0)    //打开管道失败
    {
        printf("read error\n");
        return 1;
    }
    else   //打开管道成功
    {
        char buf[100];
        memset(buf,'\0',sizeof(buf));
        while(1)
        {
            int red = read(fd,buf,sizeof(buf));  //把管道里面的内容读取到buf中,所以上面应该加上memset这个函数,对buf进行初始化
            if(red <= 0)   //
            {
                printf("read error\n");
                break;
            }
            printf("%s\n",buf);
        }
        close(fd);
    }
    return 0;
}
进程通讯、命名管道、一对多连接 进程通讯实现的多个客户端连接同一个命名管道 立即下载

相关推荐

IPSec Over GRE和GRE Over IPSec技术

IPSec Over GRE 和 GRE Over IPSec 一. 技术介绍 IPsec     主要作用是对数据进行加密,因为他能提供所有有时候被单独用作实现加密的一种方法!IPsec建立的是一个逻辑隧道,并不是真正意义上的隧道!并且不能提供路由功能,因为IPsec不支持非ip流量,也不支持广播(组播)! GRE     (通用路由封装)能很好的提供一个真正意义上的点对点的隧道,GRE是一种三层VPN封装技术。GRE可以对某些网络层协议(如IPX、Apple Talk、IP等)的报文进行封装,使封装后

qq_56228347的博客 9870

利用命名管道实现进程之间的通信 .........

/* 命名管道不仅可以实现 本地进程之间的通信还可以实现网络进程的通信 与油槽不同的是 管道式基于面向连接的可靠的通信 只能一对一传输 数据 我们可以通过 CreateNamedPipe()创建一个管道 ,可以指定模式是双向 即客户端 和服务端都可以进行读写 管道 就跟基于 socket的TCP通信类似 在服务端调用ConnectNamedPipe()来等待客户端连接管道 ,...

网站开发初中级代码参考-转载 216

Blender软件导出地形到Gazebo中

Blender软件导出地形到Gazebo中,并配置纹理、刚度、高度。

m0_70652514的博客 3377

Linux命名管道特性总结

Linux管道特性总结 话不多说,直接总结管道的特性吧! 1.必须同时有读端和写端。假如只有一边,那么open()函数将会阻塞。 2.在写入时,如果没有读端,写入方将会受到SIGPIPE信号。 3.默认情况下,读取和写入均是阻塞的。 下面用代码实测: ...

weixin_44284357的博客 514

微信小游戏CE修改实战:从入门到精通(附防作弊思路)

本文深入探讨微信小游戏的安全攻防实战,重点分析CE修改、反编译和重打包等安全风险。通过详细的内存修改案例和代码保护方案对比,提供从客户端到服务端的全方位防护策略,帮助开发者构建有效的防作弊体系。

m2n3b4v5c6的博客 1149

TSMC40nmLP版图实战:从Design Rule解读到Cadence高效布局布线

本文详细解析了TSMC40nmLP工艺的版图设计实战,从Design Rule解读到Cadence高效布局布线技巧。重点介绍了40nm工艺中的关键设计规则,如最小线宽、间距规则和深N阱规则,并分享了Cadence Virtuoso中的高效工作流和射频模块设计技巧,帮助工程师提升版图设计效率和质量。

weixin_29250403的博客 378

管道/命名管道

匿名管道: 概述: 用于Unix系列系统。单向数据通道,写端写的数据在被读端读取之前会被操作系统缓存。双向管道需要通过创建两个单向管道实现 之所以是匿名的。是因为匿名管道不存在于文件系统中,随着使用它的进程结束而结束,没有名称。没有特别指明的话,管道指匿名管道。 管道为多个文件创建了临时的直接连接,这使得整合起来的管道整体性能比各个程序分别运行要...

aoningxun2220的博客 427

SoC 内的 CPU、GPU、DSP、NPU 协同执行结构图解析:多异构协同的最新实战体系

随着移动端 AI 能力迅速演进,SoC(System on Chip)内部的多种异构计算单元(CPU、GPU、DSP、NPU)之间的协同执行能力成为衡量芯片智能算力的关键指标。本文基于截至 2025 年 5 月最新主流国产芯片(如海思昇腾、地平线旭日、联发科天玑、高通骁龙 8 Gen 系、寒武纪思元等)在实际落地应用中的公开结构与技术资料,深入解析 CPU-GPU-DSP-NPU 协同执行的体系结构、执行路径与调度逻辑。文章结合 Android NNAPI、Vulkan Compute、自定义调度器等工程实

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 8710

【Linux】进程间通信——命名管道

匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用命名管道来做这项工作。在Linux系统中,命名管道(也称为FIFO)是一种特殊的文件类型,它允许进程间进行通信。与匿名管道不同,命名管道存在于文件系统中,并且可以被任何有适当权限的进程访问。命名管道提供了一种方法,使得不相关的进程能够通过预先定义好的路径来交换数据。匿名管道由pipe函数创建并打开。而命名管道由mkfifo函数创建,打开⽤open。FIFO(命名管道)与pipe。

Renswc的博客 3326

RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)

本文记录的是利用中的模块优化的目标检测网络模型。通过局部特征提取器、周围环境提取器、联合特征提取器和全局环境提取器来提取局部特征、周围环境和全局环境信息,充分利用不同层次的信息。本文将其应用到中,并进行二次创新,使网络能够更好的处理多类别目标的分类能力。CGNet: A Light-Weight Context Guided Network for Semantic Segmentation1️⃣ 首先通过局部特征提取器floc(∗)floc(*)floc(∗)和周围环境提取器fsur(∗)f_{sur }

Limiiiing的博客 1350

Flask基础项目:从零到一搭建用户管理系统

本文介绍了一个基于Flask的用户管理系统,具有完整的增删改查功能。系统采用SQLAlchemy ORM进行数据库操作,自动处理SQL注入并首次运行时创建表结构。主要特点包括:实时统计用户总数和平均年龄、智能即时搜索、前后端双重数据验证、邮箱唯一性检查、流畅动画效果和响应式设计。后端使用Flask框架实现RESTful API,前端采用现代化UI设计,支持异步操作不阻塞界面。系统安装简单,只需创建数据库并安装依赖即可运行,适合作为基础用户管理系统的参考实现。

数据知道的博客 3838

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Linux 进程间通信 管道系列: 匿名和命名管道,自定义shell当中命令行管道的模拟实现

Wzs040810的博客 2412

【OpenFOAM】-olaFlow-算例10-wavemakerTank

采用 Flap和Piston两种方式的动网格进行造波

ou_no的博客 2168

Linux进程间通信——使用命名管道

在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便。这里将会介绍进程的另一种通信方式——命名管道,来解决不相关进程间的通信问题。 一、什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系

ljianhui的专栏 8万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【进程间通信】管道和命名管道

一个文件被打开了两次,因为他们打开的方式不一样,所以他们的标记为也一定不一样,它们在内存中的file结构体一定是存在两份的,但是文件的属性和操作集合都是一样的,所以文件属性和操作集合以及文件缓冲区是存在一份的,每个file结构体中会有一些基本的属性(读写位置等等),其次还会有一些指针,分别指向自己的属性和方法集合以及缓冲区。我们可以看到fd数字是一个文件描述符数组,所以Linux管道是复用了很多文件部分的代码的,所以在通信的时候很多还是文件的操作。管道是Unix中最古老的进程间通信的形式。

bushibrnxiaohaij的博客 1446

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

管道实现进程间通信之命名管道

管道通信之命名管道

xbhinsterest11的博客 1055

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Linux学习】进程间通信——匿名管道 | 命名管道

介绍了进程间通信的相关概念,详细讲解了匿名管道和命名管道的工作原理和代码实现。还有详细介绍了进程池小项目。

weixin_63726869的博客 2262

【Linux】进程间通信--管道(匿名管道和命名管道)

文章目录前言进程间通信的目的管道匿名管道管道特点在文件描述符角度理解管道 前言 进程间的通信,其实就是两个进程需要进行交流,从另一个角度上想:进程本身就是程序员给开辟的,所以进程间通信也就是程序员的通信; 我们需要理解的是:进程通信是存在协同的场景的(也就是有顺序的场景); 比如:cat test.c | wc -l 这条命令:就是把 cat进程的结果交给wc进程去执行,这就是先后顺序; 但是我们知道进程之间是独立的,那么也就是说:不同的进程是看不到对方的资源的; 这么来说既然独立,进程是如何通信的呢?

呋喃吖的博客 4140

进程间通信之管道(匿名管道与命名管道)

艺术来源于生活,消息传输的时候我们就流水一样,所以我们联想到了管道,因此他也有个特殊的性质半双工通信,也就是只能单向传递,同一时间不能既发送又接收管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。==这里我们可以看到,管道就是由操作系统管理,在内核中的一个缓冲区(内存)==所以多个进程访问同一块空间的时候就完成了通信匿名管道:管道没有标识符,不能被其他进程找到,因此只能用于具有亲缘关系的进程间通信。

awofe的博客 1146

【Linux系统】进程间通信:命名管道

本文介绍了命名管道的概念及其在进程间通信中的应用。首先分析了匿名管道的局限性(仅限亲缘进程、单向通信等),进而引出命名管道的优势:通过文件系统路径实现任意进程间通信。文章详细说明了命名管道的创建方法(命令行和程序内创建)、操作规则(阻塞/非阻塞模式)以及与匿名管道的区别。重点阐述了命名管道的打开规则,包括不同模式下(O_RDONLY/O_WRONLY)结合O_NONBLOCK标志的行为差异。最后通过C++代码示例展示了如何封装命名管道类,实现无亲缘关系进程间的单向通信,包含管道创建、读写操作和资源回收的完整

2402_82670467的博客 1690

进程间通信之命名管道

管道应用的一个限制就是(具有亲缘关系)的进程间通信,这种通信可以用来实现。如果我们想,可以使用FIFO文件来做这项工作,它经常被称为。1.什么是命名管道?命名管道(named pipe)也称为FIFO,它是一种文件类型,创建一个FIFO文件类似于创建一个普通文件。FIFO解决了只有具有亲缘关系的进程间才能通信的问题。并且命名管道是一种特殊类型的文件。2.匿名管道与命名管道的区别?

k5426244的博客 1172

进程间通信——命名管道

命名管道命名管道定义命名管道创建命令行上创建程序内创建命名管道间通信匿名管道和命名管道区别 命名管道定义 上一篇博客中介绍了匿名管道的用法以及他的特点,但是它存在一定的限制,例如他只能在两个具有公共祖先的进程间进行通信例如父子进程。但是如果想要在不相关的两个进程之间进行数据交互,这可以使用命名管道。命名管道是一种特殊类型的文件 命名管道创建 命令行上创建 创建命名管道可以直接在命令行上使用mkfifo命令来创建。 创建结果如下,注意的是这里的文件类型是以p开头的。 为了测试这个管道功能,可以将Linux

h1091068389的博客 3749

[Linux] 进程间通信——匿名管道&&命名管道

[Linux] 进程间通信——匿名管道&&命名管道

石墨博客 1414

【Linux】进程间通信——进程间通信的介绍和分类、管道、匿名管道、命名管道、匿名管道与命名管道的区别

Linux、进程间通信、进程间通信的介绍、目的和发展、进程间通信分类、管道、匿名管道、匿名管道的原理(文件角度)、匿名管道的原理(内核角度)、管道读写规则、管道特点、命名管道、创建命名管道、命名管道的打开规则、命名管道实现server&client通信

Crocodile1006的博客 854
上一篇: 进程程序替换
下一篇: Linux网络端口
NeilZhy
博客等级 码龄11年 175粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值