在* nix系统中创build临时命名的fifo

我有一些任务需要大量的临时命名pipe道来处理。

最初,我只是简单地认为生成随机数字,然后将其附加为<number>.fifo是命名pipe道的名称。

但是,我发现这个职位: 在Python中创build一个临时的FIFO(命名pipe道)?

看来有些东西我不知道,可能会导致一些安全问题。

所以我的问题是,什么是最好的方式来生成命名pipe道?

请注意,尽pipe我引用了一个Python相关的post,但我并不是只想用Python来提问。

更新:

因为我想用一个命名pipe道来连接不相关的进程,所以我的计划是先通过shell调用进程B,然后捕获stdout来获取pipe道的名字,然后都知道要打开什么。

在这里,我只是担心是否泄漏pipe道的名称将成为一个问题。 之前我从来没有想过,直到我读了Python的post。

如果您必须使用命名的FIFO,并且需要确保不会发生重叠/覆盖,最好的方法是使用mktempmkfifo组合。

尽管mktemp本身不能创建FIFO,但是它可以用来创建唯一的临时目录,然后你可以放入你的FIFO。

GNU mktemp文档就是一个例子。

或者,您可以创建一些包含随机字母的名称。 您可以从/dev/random (或/dev/urandom , 随机读取(4) )读取一些随机字节,例如播种一个PRNG (例如随机(3)由srandom ),和/或混合PID和时间等。

而且由于命名的fifo(7)是文件,您应该使用权限系统(和/或ACL )。 特别是,你可以创建一个命令Linux用户来运行你的所有进程,并限制FIFO只有所有者可读,等等。

当然,在任何情况下,您都需要安全地“存储”或“传输”这些FIFO名称。

如果你在一些bash脚本中启动你的程序,你可以考虑使用mktemp(1)来使你的fifo名称为:

 fifoname=$(mktemp -u -t yourprog_XXXXXX).fifo-$RANDOM-$$ mkfifo -m 0600 $fifoname 

(也许在一些循环中)。 我想如果脚本运行在一个专用的用户(然后在一些管道或文件中传递$fifoname ,而不是作为程序参数)

最近的renameat2(2)系统调用可能会有帮助( RENAME_EXCHANGE原子性)。

顺便说一句,你可能需要一些SElinux。 请记住,打开的文件描述符(包括您的fifos)可用作proc(5)中的符号链接!

PS。 这一切都取决于你是多么偏执。 一个系统完善的Linux系统可以相当安全。