“管道”那些事儿
这一篇推送,主要来说一下“管道”的那些事。我们上一篇推送,为大家简短的说了一下“管道”的概念。关于以后的几篇IPC的推送,都会举一些生动的例子来让大家更好地理解这些东西。对于这些东西的理解,无需去知道它具体是怎么用的,因为根据操作系统的不同,可能有很多种不同的用法。我们讲的这些东西,归根到底只是一系列的数据结构,而我们为了便于记忆,对其进行命名而已。因此,可以说所有的数据结构模型,都是来源于日常的生活。那些发明这些数据结构的工程师,只不过比常人多了一分对生活的细致观察,并且用代码实现而已,大家以后的工作中,也可以多留意生活现象,从而自己来写出一些优秀的算法。
(一) 管道(PIPE)
首先来分析一下管道的数据模型。前面说了,管道是一种单向的数据存储区域,每次在C语言代码中使用它时,必须先像定义变量一样,定义一个管道。假设我们用一下代码去创建:
pipe_fd = pipe_create(pStrPipeName, PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0);
其实,在所有的操作系统里面定义一个管道,其方法都差不多,而我们不需要去关注“(pStrPipeName, PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 0, 0, NMPWAIT_WAIT_FOREVER, 0); ” 里面的东西,因为这些东西可能会由于平台的不同而有所区别。我们只要知道的是,当一个管道创建完成之后,其返回值就是当前被创建管道的ID号,我们利用Linux的习惯,称之为“pipd_fd”(管道描述符),这个东西,就是我们以后识别某个管道的ID号,有且唯一,不可重名。而以Linux来说,管道创建失败,则会返回一个错误宏,这个东西不需要去管。
接着,来说下管道的数据写入。我们只需要使用特定的API去写你想要的管道即可,并且几乎所有操作系统的管道写入API都会提供给用户一个可以接入pipd_fd的参数,来指定管道。每次写入时候,我们可以简单地理解就是对该管道德头部插入一个指定数据类型的数据。
每次数据都会从管道的一端进行写入,而从另一端进行读出。每次读出一个数据之后,就会将所有的数据向前移位,进而来实现先进先出的数据结构。
最后说明一点,普通管道,其创建之后,必须进行回收,最终的数据结构是一种存放入“堆区”中的链表,而不是简单的一块“栈区”数组。
如果一定要举一个生活中的实际例子来描述一下管道,其结构是和过安检的传送带是一个道理。
(二) 有名管道(named PIPE或者FIFO)
有名管道的数据操作是和管道一模一样,唯一的区别就是,有名管道的“名”指的是文件名,也就是说,你一旦创建了一个有名管道之后,就会在硬盘上创建一个以此管道名为名的文件,专门用于这种数据结构的操作。
如果大家觉得我的付出可以为你带来些许的收获,请点击下方进行分享,让更多人得到这份收获。