首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 命名管道实例详解

linux进程间通信——命名管道 FIFO(命名管道)不同于匿名管道之处在于它提供⼀个路径名与之关联,以FIFO的⽂件形式存储于⽂件系统中。...命名管道是⼀个设备⽂件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。...值得注意的是,FIFO(first input first output)总是按照先进先出的原则⼯作,第⼀个被写⼊的数据将⾸先从管道中读出。 创建命名管道的系统函数有两个:mknod和mkfifo。...:mod为创建的命名管道的模式,指明其存取权限;dev为设备值,该值取决于⽂件创建的种类,它只在创建设备⽂件时才会⽤到。...下⾯使⽤mknod函数创建了⼀个命名管道: umask(0); if (mknod("/tmp/fifo",S_IFIFO | 0666) == -1) { perror("mkfifo error

4K21

Linux命名管道及函数

管道(pipe)应用的一大局限是没有名字,只能用于具有亲缘关系进程之间的通信。而命名管道,也称FIFO,实质是一种文件类型,通过FIFO可以用于任何两个进程间的通信。...命名管道的创建 命令方式 在shell中可以使用mkfifo命令创建一个命名管道,格式为: mkfifo [option] name 其中option选项用于选择创建FIFO的模式,使用形式为-m mode...编程示例 创建一个命名管道,create_FIFO.c: #include #include #include #include...命名管道的读写 一般的文件I/O函数均可用于FIFO操作,如open、close、read、write等,若要删除一个命名管道,则使用系统调用unlink。...测试之前先使用mkfifo命令创建一个名为fifo1的命名管道: mkfifo -m 666 fifo1 然后打开两个shell窗口,依次运行write_fifo和read_fifo两个程序。

2.6K10
您找到你想要的搜索结果了吗?
是的
没有找到

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

@TOC 命名管道 匿名管道只能用来进行进程间通信,让具有血缘关系的进程进行通信 让毫不相关的进程之间进行通信,就需要采用命名管道通信 因为该文件有文件名称的,而且必须要有,所以叫做命名管道 1....见一见管道文件 mkfifo函数 输入 man mkfifo 指令 制作一个 FIFOS ,表示命名管道 ---- mkfifo fifo 制作一个管道 ,并命名为 fifo 文件类型以p开头...命名管道原理 要打开对应的文件,就会在操作系统内创建struct file对象,struct file对象有自己的缓冲区 由于0 1 2 分别被占用,所以3指向struct file对象 若有一个毫不相关的进程...对象中存在一个引用计数默认为1 ,当新创建一个进程时,引用计数就会变成2 此时两个进程指向同一份文件 目的是让两个进程之间进行通信,所以就不应该把数据刷到磁盘上, 应该把磁盘文件改为内存级的,不会进行刷盘,把它命名管道文件...用命名管道实现server&client通信 在vscode中,分别创建server.cc文件和client.cc文件以及makefile 如何使用makefile连续生成可执行程序 若这样创建makefile

1.8K30

Linux进程间通信【命名管道

:p 管道文件 出自:Linux 权限理解和学习 这个管道文件也非常特殊:大小为 0,从侧面说明 管道文件就是一个纯纯的内存级文件,有自己的上限,出现在文件系统中,只是单纯挂个名而已 可以直接在命令行中使用命名管道...《Linux进程间通信【匿名管道】》 2.1、特点 可以简单总结为: 管道是半双工通信 管道生命随进程而终止 命名管道任意多个进程间通信 管道提供的是流式数据传输服务 管道自带 同步与互斥 机制 2.2...注意: 创建管道文件后,无论先启动读端,还是先启动写端,都要阻塞式的等待另一方进行交互 3.2、实现进程控制 在 Linux 匿名管道 IPC 中,我们实现了一个简易版的进程控制程序,原理是通过多条匿名管道实现父进程对多个子进程执行任务分配...的具体实现可以看看这篇文章 《Linux模拟实现【简易版bash】》 步骤: 创建命名管道 将 bash 改装,打开命名管道文件,作为 读端 创建独立进程,打开命名管道文件,作为 写端 进行 IPC,发送命令给...》 ---- 总结 以上就是本次关于 Linux 进程间通信之命名管道的全部内容了,作为匿名管道的兄弟,命名管道具备匿名管道的大部分特性,使用方法也基本一致,不过二者在创建和打开方式上各有不同:匿名管道简单

20120

Linux命名管道的创建方法&&基于命名管道的两个进程通信的实现

一、匿名管道命名管道的区别 匿名管道由pipe函数创建并打开。...命名管道由mkfifo函数创建,打开用open FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。...二、删除命名管道的函数 #include // 返回值:成功返回0,出错返回-1 int unlink(const char *pathname); pathname指创建出来的管道的路径和管道名...三、利用命名管道实现两个进程之间的简单通信  这个通信将实现写端发送信息读端接收信息。更多地实现细节会在代码中以注释的方式给出。...<< endl; while (true) { char buffer[1024]; //读端不退,read函数会一直阻塞等待,读端退出read读到0

9810

linux系统编程之管道(三):命名管道FIFO和mkfifo函数

一、命名管道(FIFO) 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。...,mode_t mode); 二、命名管道和匿名管道 匿名管道由pipe函数创建并打开。...命名管道由mkfifo函数创建,打开用open。 FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,这些工作完成之后,它们具有相同的语义。...三、命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开...非阻塞时也不难测试,open时增加标志位就可以了。 需要注意的是 命令管道与匿名管道的读写规则是一样的,参见这里。

3.3K60

Linux 进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

实现细节: 在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。...管道的读取过程和写入过程类似。但是,进程可以在没有数据或内存被锁定时立即返回错误信息,而不是阻塞该进程,这依赖于文件或管道的打开模式。 反之,进程可以休眠在索引节点的等待队列中等待写入进程写入数据。...为了解决这一问题,Linux提供了FIFO方式连接进程。FIFO又叫做命名管道(named PIPE)。...FIFO只是借用了文件系统(file system,命名管道是一种特殊类型的文件,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。)来为管道命名。...FIFO中写入数据而阻塞打开FIFO,那么称该进程内的写操作为设置了阻塞标志的写操作。

2.3K30

浅谈 windows 命名管道

一、管道简述 管道并不是什么新鲜事物,它是一项古老的技术,可以在很多操作系统(Unix、Linux、Windows 等)中找到,其本质是是用于进程间通信的共享内存区域,确切的的说应该是线程间的通信方法(...任何进程都可以访问命名管道,并接受安全权限的检查,通过命名管道使相关的或不相关的进程之间的通讯变得异常简单。...在这里,管道服务端进程指的是创建命名管道的一端,而管道客户端指的是连接到命名管道某个实例的一端。 总结一下: 1、命名管道的名称在本系统中是唯一的。 2、命名管道可以被任意符合权限要求的进程访问。...3、命名管道只能在本地创建。 4、命名管道是双向的,所以两个进程可以通过同一管道进行交互。 5、多个独立的管道实例可以用一个名称来命名。...: 1.创建命名管道 --> 2.连接命名管道 --> 3.读写命名管道 a、创建 管道服务器无法在另一台计算机上创建管道,因此 CreateNamedPipe 必须使用句点.作为服务器名称,如以下示例所示

9.2K30

红队 | Windows命名管道

命名管道Named pipes:命名管道则强大的多,它是面向消息和全双工的,同时还允许网络通信,用于创建客户端/服务器系统。...因此管道客户端Pipe Client要想连接管道服务端Pipe Server,就必须得知道服务端的管道名称。 命名管道的创建与访问 创建命名管道只能在本机上创建,且得具有一定的权限。...,命名为MyPipe,消息只能从客户端流向服务器,读写数据采用阻塞模式,字节流形式,超时值置为0表示采用默认的50毫秒 hPipe = ::CreateNamedPipe(L"\\\\....\\pipe\\") 命令可以查看到我们创建的SD命名管道 ? 命名管道的访问 虽然命名管道支持跨计算机跨网的访问连接,但是会受到访问控制列表(ACL)或者说本地策略限制。...命名管道还常被用作 C2 信道,通讯执行命令。 如图所示,每个终端将为每个直接连接的子终端提供一个命名管道服务器和一个命名管道客户端。服务器监听管道名称,并等待客户端的连接。

1.8K20

Windows进程间通信—命名管道

大家好,又见面了,我是全栈君 命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。...与Socket网络通信相比,命名管道不再需要编写身份验证的代码。将命名管道作为一种网络编程方案时,它实际上建立了一个C/S通信体系,并在其中可靠的传输数据。...命名管道服务器和客户机的区别在于:服务器是唯一一个有权创建命名管道的进程,也只有它能接受管道客户机的连接请求。而客户机只能同一个现成的命名管道服务器建立连接。...命名管道服务器只能在WindowsNT或Windows2000上创建,不过可以是客户机。命名管道提供了两种基本通信模式,字节模式和消息模式。...服务端代码流程: 1、创建命名管道:CreateNamedPipe 2、等待客户端连接:ConnectNamedPipe 3、读取客户端请求数据:ReadFile 4、向客户端回复数据:WriteFile

1.2K10

通过命名管道分析检测 Cobalt Strike

这种模式提供了许多好处,一个是能够执行长时间运行的任务,例如:“键盘记录器”,不会阻塞主 Beacon 线程。一般来说都是由反射 DLL 实现的。...答案是:管道管道是用于进程相互通信的共享内存。基本上有两种类型的管道命名管道和未命名管道命名管道,顾名思义,有一个名字,可以通过引用这个名字来访问。...匿名管道,需要将其句柄传递给其他通信进程以交换数据。这可以通过多种方式完成。 Cobalt Strike 使用命名管道和未命名管道在信标与其牺牲进程之间交换数据。...命名管道 F-Secure 观察到,当使用 Cobalt Strike 的一些模块将反射 DLL 注入牺牲进程时,会创建一个具有可预测模式的命名管道。...请注意,这些命名管道不是用于横向移动的 SMB 命名管道,可以通过可塑性配置文件进行自定义。在 4.2 版之前,操作员无法修改此命名管道的名称。

1.4K20

Linux: linux 匿名管道

相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+123..., 那咱们来看下 管道的读写规则吧: 当没有数据可读时 O_NONBLOCK (未设置):read调用阻塞,即进程暂停执行,一直等到有数据来到为止。...当管道满的时候 O_NONBLOCK (未设置): write调用阻塞,直到有进程读走数据 O_NONBLOCK ( 设置 ):调用返回-1,errno值为EAGAIN 如果所有管道写端对应的文件描述符被关闭...,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

33.9K41

Python进程间通信之命名管道

管道是一种简单的FIFO通信信道,它是单向通信的。 通常启动进程创建一个管道,然后这个进程创建一个或者多个子进程接受管道信息,由于管道是单向通信,所以经常需要创建两个管道来实现双向通信。...命名管道是对传统管道的扩展,默认的管道是匿名管道,只在程序运行时存在;而命名管道是持久化的,当不需要时需要删除它。 命名管道使用文件系统,由mkfifo()方法创建。...命名管道支持阻塞读和阻塞写操作: 如果一个进程打开文件读,它会阻塞直到另外一个进程写。 但是我们可以指定O_NONBLOCK选项来启用非阻塞模式。...命名管道必须以只读或者只写的模式打开,它不能以读+写的模式打开,因为它时单向通信。如果要实现双向通信,必须打开两个命名管道。...下面是一个 Python 使用命名管道来实现进程间通信的例子 Server 端 import os, time read_path = "/tmp/pipe.in" write_path = "/tmp

3.6K100

Linux管道命令

1 什么是管道命令? 管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息。...如,/etc目录下会有大量的文件,如果使用ls很难找到需要的文件,因此可以使用管道命令将ls的结果进行一次筛选,只保留需要的信息。 2 管道 和 数据流重定向 的区别?...管道一词非常生动形象,原始数据经过管道后,管道会将一部分不需要的信息过滤掉,只保留用户所关注的信息。 数据流重定向是指定数据在哪里显示,默认情况下会在屏幕显示,我们可以指定它输出到文件。...3.3.2.2 方式2:命令 | sort [-参数] 使用管道,将前一个命令执行的结果按照指定字段进行排序。...lastfile中,然后数据流将会输出到屏幕上,我们可以在输出前再添加一条管道,只输出数据的第一个字段。

4.4K70

使用命名管道实现进程间通信

创建命名管道 命名管道常常用于应用程序之间的通迅,由于不需要进行序列化和反序列化操作,效率是非常高的。相比TCP通信方式,效率更高,但比共享内存要低点。...命名管道可以在本地机器或者局域网内机器实现进程间通信,所以是最佳的通信方式。...NamedPipeServerStream pipeServer = new NamedPipeServerStream(_pipName, PipeDirection.InOut, 10); 这里表示命名管道服务器的管道放心为双向通信...(); 这种方式可以读取全部数据,但是,在管道的另外一段,如果留写操作器不调用 Close方法,这里没法读取完成,程序会阻塞在这里。...经过测试,这种方法是先命名管道客户端-服务器通信成功。

1.4K50

Linux编程(阻塞和非阻塞IO)

Linux设备驱动中的阻塞和非阻塞I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。...非阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞的访问最终会引发设备驱动中 poll 函数执行。...=1); //串口上没有输入则返回,所以循环读取 printf("%c/n",buf); 阻塞操作常常用等待队列来实现,而非阻塞操作用轮询的方式来实现。...非阻塞I/O的操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无阻塞访问。select()和poll()系统调用最终会引发设备驱动中的poll()函数被调用。...return mask; } 三、总结 阻塞与非阻塞操作: 定义并初始化等待对列头; 定义并初始化等待队列; 把等待队列添加到等待队列头 设置进程状态(TASK_INTERRUPTIBLE(可以被信号打断

5.4K20

dotnet 用 MVC 的方式打开 IPC 命名管道

,此库的顶层 API 是采用 ASP.NET Core 的 MVC 框架,其底层通讯不是传统的走网络的方式,而是通过 dotnetCampus.Ipc 开源项目提供的 NamedPipeStream 命名管道的方式进行通讯...本库的优势是可以使用设计非常好的 ASP.NET Core 的 MVC 框架作为顶层调用 API 层,底层通讯采用可提升传输性能的命名管道,如此可以做到不走网络通讯从而极大减少网络端口占用问题和减少用户端网络环境带来的问题...框架上,可采用 dotnet campus 组织基于最友好的 MIT 协议开源的 dotnetCampus.Ipc 开源库进行本机内多进程通讯 此 dotnetCampus.Ipc 开源库底层可基于命名管道进行通讯...服务端可以采用替换 ASP.NET Core 的“通讯传输”为 dotnetCampus.Ipc 的基于命名管道的传输方式。客户端呢?...在 UsePipeIpcServer 方法里面需要传入一个参数,此参数用于开启的 IPC 服务所使用的服务名,也就是作为命名管道管道名。

93620

Linux进程通信——管道

管道 进程通信概念 管道 匿名管道 创建匿名管道的过程 管道读写的特性 管道本身的特征 基于管道的进程池设计 命名管道 让两个无血缘关系的进程通信 进程通信概念 什么是进程通信 首先我们清楚,进程是具有独立性的...这说明如果管道没有数据了,读端在读,默认会直接阻塞当前正在读取的进程,只有管道有数据,操作系统识别到,读端才会去读取数据。 2. 管道是一个固定大小的缓冲区。...命名管道 这个管道可用于两个没有血缘关系的进程进行通信。 第一个参数是文件路径+文件名,第二个参数是权限(和创建文件的权限是一个东西)。 成功返回0,失败返回-1....这个就是命名管道,P开头。 注意:这里大小都没变。 本来应该打印在左侧的通过管道文件传到了右边。此时这里就完成了命令行式的打印。 但是这里还是大小不变。这是为什么呢?...因为在open这里阻塞中。需要写端打开才能继续跑。 管道文件必须两端同时打开才会继续运行代码。 第二个 我们读端输出并没有换行,为什么自己换行了呢?

3.9K70
领券