【发布时间】:2017-12-27 06:15:21
【问题描述】:
我一直在研究所有不同类型的 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>,但我不确定这是否是一个好/可行的想法?
有没有更好的解决方案?
感谢您的帮助。
【问题讨论】:
-
我一直想滥用 Bash 的
pushd -n item ; dirs +n ; popd -n作为脚本中的堆栈。让我知道它是否有效。 -
谢谢,但我不需要推送弹出目录,我想在内存中有一个空间,由 2 个进程共享,就像
stack/LIFO -
实现这一点并不难,但您首先要决定的是您要在堆栈中放入什么?字节?字符串?
int值?然后你必须决定如何存储这些项目,假设你实现了一个内核驱动程序。或者即使您存储了这些项目 - 也许您会阻止写入过程,直到它放入堆栈的项目被读取? (如果写入过程没有阻塞,您确实必须存储项目 - 但是您必须控制可以存储的数量......)需要做出很多设计决策,并且它们会做出非常具体的决定堆栈。
标签: linux file unix data-structures ipc