Linux进程间通信(三) 管道通信之有名管道及其基础实验

有名管道(FIFO)

首先将上一节的有关有名管道的定义再贴出来

有名管道是对无名管道的一 种改进,它具有以下特点:

①  它可以使互不相关的两个进程间实现彼此通信;

②  该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它 当做普通文件一样进行读写操作,使用非常方便;

③  FIFO严格地遵循先进先出规则,对管道及 FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作 。

有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路 径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。

在管道创建成功后 ,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可 在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞 问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以 在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。

对于读进程 :

若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入 。

若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果 FIFO内没有数据,则读函数将立刻返回0。

对于写进程:

若该管道是阻塞打开,则写 操作将一直阻塞到数据可以被写入。

若该管道是非阻塞打开而不能写入全部数据,则读操作 进行部分写入或者调用失败。

下表列出了mkfifo()函数的语法要点

为了方便咱们查错,再对FIFO相关的出错信息进行归纳,如下表:

时间: 2024-10-30 13:50:05

Linux进程间通信(三) 管道通信之有名管道及其基础实验的相关文章

Linux进程间通信(二) 管道通信之无名管道及其基础实验

管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输 入(其实我更愿意将管道比喻为农村浇地的管子).Linux的管道主要包括两种:无名管道和有名管道.这一节 主要讲无名管道,首先介绍一下这两个管道.(特点很重要啊!) 1.无名管道 无名管道是 Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点: ①  它只能用于具有亲 缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间): ②  它是一个半双工的通信模 式,具有固定的读端和写端: ③

Linux进程间通信学习:如何使用命名管道

在前一篇文章--Linux进程间通信--使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便.这里将会介绍进程的另一种通信方式--命名管道,来解决不相关进程间的通信问题. 一.什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似. 由于Linux中所有的事物都

Linux进程间通信(六) 信号量通信之semget()

信号量通信之semget().semctl().semop()及其基础实验 这个信号量理解起来是有点不容易啊,我看书看了好几遍才知道怎么回事.在讲这一节信号量之前,我还 是想先说几个小知识点,这也是我在学习完后最终理解的"精华",哈哈! 信号量是干啥的? 信号量就是用来解决进程间的同步与互斥问题的一种进程间通信机制. 同步与互斥的通俗理解 这两个名词咱们从字面上就能理解.举个例子吧,在创建子进程时,你是怎么保证父子进程执行的先后顺序呢 ?我在以前的时候是通过sleep()函数来实现的,

Linux多任务编程(四) exit()函数及其基础实验

exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止 进程则使用exit()和_exit()函数.当进程执行到exit()或_exit()函数时,进程会无条件的停止剩下的所有操 作,清除各种数据结构,并终止本进程的运行.但是,这两个函数还是有区别的,其调用过程如图1所示: 从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其 在内核中的各种数据结构:而exit()函数则在这些基础上做了一些包装,在执行

Linux多任务编程(二) fork()函数及其基础实验

fork()函数 在 Linux 中创建一个新进程的唯一方法是使用fork()函数.fork()函数是 Linux 系统中 一个非常重要的函数,和咱们以前遇到过的函数由一些区别,因为它看起来执行一次却返回两个值,这又作何 解释?不着急,慢慢看. 函数说明 fork()函数用于从已存在的一个进程中创建一个新的进程 ,新进程称为子进程,而原进程称为父进程.使用fork()函数得到的子进程是父进程的一个复制品,它从父进 程处继承了整个进程的地址空间,包括进程上下文.代码段.进程堆栈.内存信息.打开的文

Linux进程间通信学习:如何使用匿名管道

在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式--匿名管道,通过它进程间可以交换更多有用的数据. 一.什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入. 举个例子,在shell中输入命令:l

Linux环境进程间通信:管道及有名管道

  管道及有名管道 在本系列序中作者概述了 linux 进程间通信的几种主要手段.其中管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 认清管道和有名管道的读写规则是在程序中应用它们的关键,本文在详细讨论了管道和有名管道的通信机制的基础上,用实例对其读写规则进行了程序验证,这样做有利于增强读者对读写规则的感性认识,同时也提供了应用范例. 1. 管道概述及相关API应用

Linux下C编程,进程通信之无名管道通信

最近在看进程间的通信,下面说说管道通信之无名管道. 1.概述 管道是Linux中很重要的一种通信方式,他是把一个程序的输出直接连接到另一个程序的输入,并且管道具有队列的特性.如Linux命令,"ps -ef | grep root".如下图所示: 2.无名管道 2.1特点 (1)它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间). (2)它是一个半双工的通信模式,具有固定的读端和写端. (3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read.w

PHP多线程编程之管道通信实例分析_php技巧

本文实例讲述了PHP多线程编程之管道通信用法.分享给大家供大家参考.具体分析如下: 一个线程如果是个人英雄主义,那么多线程就是集体主义,你不再是一个独行侠,而是一个指挥家. 管道通信: 1. 管道可以认为是一个队列,不同的线程都可以往里面写东西,也都可以从里面读东西.写就是 在队列末尾添加,读就是在队头删除.   2. 管道一般有大小,默认一般是4K,也就是内容超过4K了,你就只能读,不能往里面写了.   3. 默认情况下,管道写入以后,就会被阻止,直到读取他的程序读取把数据读完.而读取线程也会