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

Linux进程通信——有名管道

管道(pipe)是无名管道,他是进程资源的一部分,随着进程的结束而消失。并且它只能在拥有公共祖先进程的进程内通信。而有名管道FIFO)的出现则解决了这个问题。FIFO提供了一个路径名与它关联。...此处的FIFO严格遵守“先进先出”原则。读总是从头开始的,写总是从尾部进行的。匿名管道FIFO都不支持lseek函数对他们操作。Linux下建立有名管道的函数是mkfifo。...可以看到,它以P开头,表面它是一个FIFO文件。它是真实存在于磁盘上的,不仅仅在内存中。进程结束了这个文件仍然在。FIFO和匿名管道一样,默认下要考虑阻塞。...下面,当不设置O_NONBLOCK标志的时候,FIFO和匿名管道的处理方式是一样的。...调用 write() 函数向 FIFO 里写数据,当缓冲区已满时 write() 也会阻塞。 通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会退出。

2.7K30

Linux进程间通信--管道(pipe和fifo)

当写管道时,如果管道中已经满了,则会阻塞,直到管道另一端读出数据(可见读出数据时,管道中将不会保留该数据)。           3....fifo        fifo用来创建一个命名管道,可以解决非血缘关系的进程间通信,它的底层的实现原理和匿名管道相同,只不过是生成了一个可见的管道文件。...这个管道文件连接一个在内核中的管道,那么这个管道文件对于所有的进程都是可见的,那么进程通过打开这个管道文件就可以通过管道文件所连接的管道来实现非血缘关系的进程间通信了。...因为这个管道有一个所有进程都可以访问到的管道文件,所以fifo叫做命名管道,那么同理,pipe就只能通过fork的方式来复制文件描述符表来共享管道,而其他的进程却访问不到,所以叫做匿名管道。        ...下面也通过代码,来简单的实现一下fifo的效果,这里我提前用mkfifo的命令来创建了一个管道文件,当然也可以在代码中使用mkfifo函数来创建,先来看一下写操作的进程的代码: #include <stdio.h

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

进程通信(一)无名管道有名管道

为了协调双方的通信,管道机制必须提供一下三个方面的协调能力:互斥、同步和确定对方存在。 下面以linux管道为例进行说明。在linux中,管道是一种频繁使用的通信机制。...在Linux中,该缓冲区的大小为4KB,使得它不像文件那样不加检验的增长。...在LINUX操作下使用 ulimit -p命令可以查看默认管道的大小。...2.有名管道 由于无名管道的局限性,仅限于有血缘关系的进程间通信,所以当需要在不同进程(无血缘关系的进程)之间通信,pipe就不能被使用了。取而代之是有名管道fifo)。...",O_WRONLY);//默认是阻塞的 if(fd == -1) { int n = mkfifo("FIFO",0664);//创建管道文件FIFO if(-1 == n) {

1.4K20

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

一、命名管道FIFO) 匿名管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。...如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。...,mode_t mode); 二、命名管道和匿名管道 匿名管道由pipe函数创建并打开。...命名管道由mkfifo函数创建,打开用open。 FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,这些工作完成之后,它们具有相同的语义。...三、命名管道的打开规则 如果当前打开操作是为读而打开FIFO时 O_NONBLOCK disable:阻塞直到有相应进程为写而打开该FIFO O_NONBLOCK enable:立刻返回成功 如果当前打开操作是为写而打开

3.3K60

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

有名管道克服了管道有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。...实现细节: 在 Linux 中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。...为了解决这一问题,Linux提供了FIFO方式连接进程。FIFO又叫做命名管道(named PIPE)。...FIFO只是借用了文件系统(file system,命名管道是一种特殊类型的文件,因为Linux中所有事物都是文件,它在文件系统中以文件名的形式存在。)来为管道命名。...写模式的进程向FIFO文件中写入,而读模式的进程从FIFO文件中读出。 当删除FIFO文件时,管道连接也随之消失。

2.3K30

Linux: linux 匿名管道

相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任务.就好像下面的命令: echo 123 | awk '{print $0+123...但其实只要有简单了解过管道这工具, 应该都不难得出解释: 管道是两边是同时进行, 也就是说, 左边的命令输出到管道, 管道的右边将马上进行处理....管道的定义 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。...,则read返回0 如果所有管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE 当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。...当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。

33.9K41

UNPv2第四章:管道FIFO

也就是说,它要么创建一个新的FIFO,要么返回一个EEXIST错误 管道FIFO的区别如下: 创建并打开一个管道只需要pipe,创建并打开一个FIFO则需要调用mkfifo再调用open 管道在将它打开着的进程中最后一个关闭它之后自动消失...对于管道而言是不可能的 5.管道FIFO的额外属性 下面是管道或者FIFO的读出与写入的若干额外规则: (1)如果请求读出的数据量多余管道或者FIFO的可用数据量,那么只返回可用数据量 (2)如果请求的数据字节小于等于...然而当一个管道FIFO设置成非阻塞时,来自wirte的返回值取决于待写的字节数以及管道FIFO当前可用空间的大小。...每次连接一个记录:应用通过关闭与其对方的连接来指示一个记录的结束 7.管道FIFO限制 系统加于管道FIFO的唯一限制为 OPEN_MAX 一个进程在任意时刻打开的最大描述字数(至少16)...PIPE_BUF 可原子的写往一个管道或者FIFO的最大数据量(至少512)

47030

Linux管道命令

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

4.4K70

linux——管道详解

管道Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。...有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。 Linux管道的实现机制 在Linux中,管道是一种使用非常频繁的通信机制。...Linux 管道的创建和使用都要简单一些,唯一的原因是它需要更少的参数。...Linux 还支持命名管道。对这些数字的早期评论员建议我,为公平起见,应该比较 Linux 的命名管道和 Windows 的命名管道。我写了另一个在 Linux 上使用命名管道的程序。...我发现对于 Linux 上命名的和未命名的管道,结果是没有区别。

2.9K20

linux 进程通信-管道(pipe)《Rice linux 学习开发》

Pipe概述 管道Linux中进程间通信的一种方式,它分为三种:无名管道,标准流管道有名管道。...它可以使互不相关的两个进程彼此通信, FIFO是严格的遵循先进先出规则,对管道FIFO的读总是从开始处返回数据,对他们的写则把数据添加到末尾,他们不支持如lseek()等文件定位操作 有名管道的穿件可以使用函数...,则不论FIFO内是否有数据,读进程都会立即执行读操作,即如果FIFO内没有数据,则读函数将立即返回0 对于写进程 ‍‍‍‍ 若管道是阻塞打开,则写操作将一直阻塞到数据可以被写入 若管道是非阻塞打开而不能写入全部数据...,则读操作进行部分写入或者调用失败 例程 通道例程中,提供了有名管道的读例程和写例程,例程请参考我github的pipe目录下的read.c和write.c。...github链接:https://github.com/RiceChen/Linux-process-communication.git,记得加个star

1.6K20

Linux进程通信——管道

管道 进程通信概念 管道 匿名管道 创建匿名管道的过程 管道读写的特性 管道本身的特征 基于管道的进程池设计 命名管道 让两个无血缘关系的进程通信 进程通信概念 什么是进程通信 首先我们清楚,进程是具有独立性的...那么我们如何让两个进程看到同一个管道文件呢? 首先清除fork是创建子进程的,子进程会继承父进程的文件地址,这样就能看到同一份管道文件了,但是这个文件并没有名字,所以叫做匿名管道。...这种通信,称之为管道通信。 这个过程其实就相当于父进程通过操作系统写给管道,也就是相当于写给操作系统,然后子进程通过操作系统从管道当中读取内容。...这说明如果管道没有数据了,读端在读,默认会直接阻塞当前正在读取的进程,只有管道有数据,操作系统识别到,读端才会去读取数据。 2. 管道是一个固定大小的缓冲区。...管道本身的特征 1.管道的生命周期是进程的生命周期 2.管道可以用来进行具有血缘关系的进程之间进行通信,常用于父子通信。

3.9K70

Linux进程间通信(上)之管道、消息队列实践

2、管道 管道分为无名管道有名管道两种方式。管道是一种半双工的通信方式,数据只能单向流动,但是无名管道有名管道的区别是无名管道只能在具有亲缘关系的进程间通信,有名管道则是在无亲缘关系进程间通信。...管道Linux支持的最初Unix IPC形式之一,管道管道之间通信其实就是一个文件,但它不是一个普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统而且只存在内存中。...char buf[20] = "hello write_fifo"; int ret=0; //创建有名管道,并赋予访问有名管道的权限 ret = mkfifo(P_FIFO,0777...\n"); return -2; } //写入数据到有名管道 //第一个参数为有名管道文件描述符 //第二个参数为写入有名管道的数据 //第三个参数为写入有名管道的数据长度..."txt" int main() { int ret; int fd; char buf[20]; //打开有名管道 //第一个参数为有名管道文件路径

2.2K10

Linux管道那些事儿

管道的本质是内核维护了一块缓冲区与管道文件相关联,对管道文件的操作,被内核转换成对这块缓冲区内存的操作。...Linux下创建管道函数: int pipe(int pipefd[2]) 成功调用pipe函数之后,会返回两个打开的文件描述符,一个是管道的读取端描述符pipefd[0],另一个是管道的写入端描述符pipefd...管道没有文件名与之关联,因此程序没有选择,只能通过文件描述符来访问管道,只有那些能看到这两个文件描述符的进程才能够使用管道。如果进程执行了fork操作,那么管道就变成如下所示: ?...单向使用管道,也就是说,如果没有用到管道的进程应该尽早释放管道文件fd,这么做不仅仅是为了让数据的流向更加清晰,也不仅仅是为了节省文件描述符,更重要的原因是:关闭未使用的管道文件描述符对管道的正确使用影响重大...由于存在实体文件,不相关的没有亲缘关系的进程也可以通过使用FIFO来实现进程之间的通信。

2.7K50

Linux进程通信 管道

(2)管道只能在具有公共祖先的两个进程之间使用。通常,一个管道由一个进程创建,在进程调用fork后,这个管道就能在父进程和子进程之间使用了。(FIFO无此局限)。       ...--《Unix环境高级编程》 通俗理解: Linux管道通信,通讯方式正如其名一样,如同一个大管道,一端流入,一端流出。...FIFO FIFO有时也会被称为命名管道,未命名的管道(PIPE)只能在两个相关的进程间使用,而且这个两个进程还要有共同的创建了它们的祖先进程。但是,通过FIFO,不相关的进程也能进行数据交换。...总结 对比以上两种管道的方式,可得出PIPE与FIFO的大致差异。 工作方式。...PIPE可称为“匿名管道”,无需命名,在具有亲属关系的进程中使用;FIFO又可称为“有名管道”,在使用过程中,其会在系统中创建FIFO类型文件,从而可通过此文件进行不相关进程间的通信。 通信方式。

3.1K10

Linux进程间通信之管道

2,linux下IPC机制的分类:管道、信号、共享内存、消息队列、信号量、套接字 3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只写一点用法吧。...3.1 特点      1)管道是最古老的IPC,但目前很少使用      2)以文件做交互的媒介,管道分为有名管道和无名管道      3)历史上的管道通常是指半双工管道 3.2 管道:有两种形式,命令行和非命令行...(1)命令行:         mkfifo testfifo         echo "testfifo" >fifo         cat fifo ?...(2)非命令行:这里又分有名管道和无名管道 编程模型:进程A创建管道(mkfifo) -> 进程A写打开管道(open) -> 进程B读打开管道(open) -> 进程A开始往管道里写数据(write)...2,linux下IPC机制的分类:管道、信号、共享内存、消息队列、信号量、套接字 3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只写一点用法吧。

2.5K80

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下进程相关操作

(5)进程通信 现在linux使用的进程间通信方式: 1、管道(pipe)和有名管道FIFO) 1)管道(pipe)的介绍 A.管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道...3)有名管道的介绍 无名管道,由于没有名字,只能用于亲缘关系的进程间通信.。为了克服这个缺点,提出了有名管道(FIFO)。...FIFO不同于无名管道之处在于它提供了一个路径名与之关联,以FIFO的文件形式存在于文件系统中,这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信,因此...注意:有名管道的名字存在于文件系统中,内容存放在内存中 4)有名管道创建 #include #include int mkfifo(const char...但是,如果没有进程已经为读而打开一个FIFO,那么只写打开将出错返回,其errno是ENXIO。类似于管道,若写一个尚无进程为读而打开的FIFO,则产生信号SIGPIPE。

2K50
领券