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

在Perl中,如何安全地创建临时FIFO?,perl,Perl,为了与文件中的相邻记录进行比较,我创建了两个分叉的子项来提供它们的写入端,并捕获了 diff -ub $previous $current 标量包含fifo路径的地方是如何工作的 这不是一个需要防弹的程序,但如果是,我将如何创建临时FIFO以避免漏洞和其他漏洞?设想有一个文件::Temp::FIFO表亲:后者的实现是什么?假设所有进程端都连接到您创建的FIFO,您就不能将它们从文件系统中删除吗?打开的文件句柄将防止FIFO被删除,但不能附加新的句柄,一旦关闭现有的文件句柄,FIFO本身将消失。

为了与文件中的相邻记录进行比较,我创建了两个分叉的子项来提供它们的写入端,并捕获了

diff -ub $previous $current
标量包含fifo路径的地方是如何工作的


这不是一个需要防弹的程序,但如果是,我将如何创建临时FIFO以避免漏洞和其他漏洞?设想有一个
文件::Temp::FIFO
表亲:后者的实现是什么?

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

创建一个临时目录(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";

为什么有两个目录?至少需要两倍的清理量。一个目录就足够了。Hmmm。。我太聪明了,不利于自己。你说得对,只需要一个临时目录。别忘了检查
tempdir
是否成功。对于我来说,tempdir()已经死了。例如,如果我让它在Linux上调用tempdir(DIR=>“/etc”),它会出现“tempdir()使用/etc/xxxxxxxxx时出错:父目录(/etc)不可写”。在Unix上,您应该会没事的-我无法回答Windows的问题。我看到的另一个问题是
mkfifo
是否遵循不完整的符号链接?在MacOS X上,shell命令和系统调用都会因EEXISTS而失败。为FIFO选择随机名称也会有所帮助。我的问题集中在创建FIFO上,但这个答案似乎假设它们是给定的。我遗漏了什么?你在问题中提到“我创建了两个先进先出”?无论哪种方式,您都可以使用
mkfifo
mknod
系统命令创建它们。与创建临时文件和
open
一样,安全地创建临时FIFO比简单地调用
mkfifo
要复杂得多,请参见。我正在讨论FIFO的临时性质,从创作部分分心。为此,我相信@Michael的答案可能是你最好的选择——创建一个安全的临时目录,并在其中创建FIFO。由于目录创建是原子的,因此很容易将它们用作锁/竞争条件的拦截器。使用bash进程替换,管道中的每个进程都在
diff
ie,
diff之前完成