Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Perl, how do I safely create a temporary FIFO?

Tags:

perl

To compare with diff adjacent records from a file, I created two FIFOs, forked children to supply their write ends, and captured the output of

diff -ub $previous $current

where the scalars contain the FIFOs’ paths—kind of how bash process substitution works.

This is not a program that needs to be bullet-proof, but if it were, how would I create temporary FIFOs so as to avoid race conditions and other vulnerabilities? Imagine File::Temp has a File::Temp::FIFO cousin: what would be the latter's implementation?

like image 514
Greg Bacon Avatar asked Sep 28 '10 23:09

Greg Bacon


2 Answers

How about creating a temporary directory (a la mkdtemp()) to avoid race conditions, and then put your FIFOs in there?

For example:

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";
like image 96
Michael Krebs Avatar answered Nov 06 '22 22:11

Michael Krebs


Assuming all the process ends are connected to the FIFOs you created, can't you just remove them from the filesystem? The opened filehandles will keep the FIFO from being deleted, but no new handles could be attached to it, and once the existing filehandles are closed, the FIFO itself will disappear.

like image 20
zigdon Avatar answered Nov 06 '22 20:11

zigdon