相当于Unix中用于LIFO / Stack结构的命名管道

时间:2017-12-27 06:15:21

标签: linux file unix data-structures ipc

我一直在查看所有不同类型的Unix文件:常规文件,目录,设备文件,符号链接,门,套接字,命名管道......

但我找不到表现得像堆栈/ LIFO结构的文件类型。

正如大多数人所知,FIFO /命名管道优于常规文件的优点如下:

来自https://askubuntu.com/questions/449132/why-use-a-named-pipe-instead-of-a-file

Linux中的几乎所有内容都可以被视为文件,但常规文件和命名管道之间的主要区别是命名管道是文件系统中没有内容的文件的特殊实例

来自man fifo

  

FIFO特殊文件(命名管道)类似于管道,但它作为文件系统的一部分进行访问。它可以通过多个读取或写入过程打开。当进程通过FIFO交换数据时,内核会在内部传递所有数据,而无需将其写入文件系统。因此,FIFO特殊文件在文件系统上没有内容;文件系统条目仅用作参考点,以便进程可以使用文件系统中的名称访问管道。

     

内核为至少一个进程打开的每个FIFO特殊文件保留一个管道对象。在传递数据之前,必须在两端打开FIFO(读取和写入)。通常,打开FIFO块直到另一端打开。

所以我想知道这种类型的文件(LIFO / Stack)在Unix中是否确实存在?如果不是这种情况有办法模拟一个吗?

我一直在考虑使用tac <named_pipe>,但我不确定这是否是一个好的/可行的想法?

有更好的解决方案吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

  

Linux中的几乎所有内容都可以被视为文件,但常规文件和命名管道之间的主要区别在于命名管道是文件系统中没有内容的文件的特殊实例。

更好的方法是查看命名管道是出现在文件系统中的管道。它没有内容存储在磁盘上,但它不仅仅是一个空的inode - 它具有特定于管道的特定行为。

  

所以我想知道这种类型的文件(LIFO / Stack)是否确实存在于Unix本地存在?

不,它不存在。与队列不同,堆栈不能被视为流;并且,在任何情况下,它在多进程环境中都不是特别有用的结构。让多个进程同时从堆栈中推送/弹出数据是没有意义的。

  

我一直在考虑使用tac <named_pipe>,但我不确定这是否是一个好的/可行的想法?

那不会奏效。 tac将读取管道的全部内容,之后管道中将不会留下任何内容。

答案 1 :(得分:1)

堆栈是一个非常有用且合理的结构。对于LIFO任务处理程序(例如程序的堆栈)非常有用。 虽然通常不是多进程,但我只需要通过pthread进行多线程这样的使用(线程之间的共享内存有助于缓解IPC),并通过控制线程的创建和终止来避免使用显式堆栈。如果您需要从共享堆栈中弹出线程,则可以执行此操作,只要您对该互斥量和任何相关部分正确地使用互斥体进行阻止即可。 (您需要确定是否同时进行一次推送和弹出,弹出是否应该等待推送完成以便可以弹出刚刚推送的内容,还是等待弹出完成以使推送发生在较低一级,或者只是先到先得)。

如果您坚持使用多进程而不是单进程和多线程,则可以使用用于IPC的管道和一个管理堆栈的附加进程来构建自己的实现。堆栈管理器将通过一个命名管道接受推送和弹出请求,并将弹出的数据推送到另一个命名管道。您将必须对数据进行结构化,以便可以将其与push / pop命令区分开,或者将推送的数据放在第三个命名管道上。您将必须了解管道缓冲区和用法,以免交叉或分割流。