在Perl中,如何安全地创建临时FIFO?

时间:2010-09-28 23:14:27

标签: perl

为了与文件中的diff个相邻记录进行比较,我创建了两个FIFOs分叉子项以提供其写入结束,并捕获

的输出
diff -ub $previous $current

其中标量包含FIFO的路径 - bash process substitution的工作方式。

这不是一个需要防弹的程序,但如果是,我将如何创建临时FIFO以避免race conditions和其他漏洞?想象一下File::Temp有一个File::Temp::FIFO堂兄:后者的实施是什么?

2 个答案:

答案 0 :(得分:6)

如何创建临时目录(la mkdtemp())以避免竞争条件,然后将你的FIFO放在那里?

例如:

use File::Temp qw(tempdir);
use File::Spec::Functions qw(catfile);
use POSIX qw(mkfifo);

my $dir = tempdir(CLEANUP=>1);
my $fifo0 = catfile($dir, "fifo0");
mkfifo($fifo0, 0700) or die "mkfifo($fifo0) failed: $!";
my $fifo1 = catfile($dir, "fifo1");
mkfifo($fifo1, 0700) or die "mkfifo($fifo1) failed: $!";

print "FIFO #0: $fifo0\n";
print "FIFO #1: $fifo1\n";

答案 1 :(得分:3)

假设所有进程结束都连接到您创建的FIFO,那么您不能将它们从文件系统中删除吗?打开的文件句柄将阻止FIFO被删除,但不能附加新的句柄,一旦现有的文件句柄关闭,FIFO本身就会消失。