В Perl, как мне безопасно создать временный FIFO? - PullRequest
12 голосов
/ 29 сентября 2010

Чтобы сравнить с diff смежными записями из файла, я создал две FIFO , разветвил дочерние элементы для предоставления их концов записи и захватил вывод

diff -ub $previous $current

где скаляры содержат пути FIFO - как bash замена процесса работает.

Это не программа, которая должна быть пуленепробиваемой, но если бы это было так, как бы я создал временные FIFO, чтобы избежать условий гонки и других уязвимостей? Представьте себе, File::Temp имеет двоюродного брата File::Temp::FIFO: какова будет реализация последнего?

Ответы [ 2 ]

6 голосов
/ 29 сентября 2010

Как насчет создания временного каталога (a 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";
3 голосов
/ 29 сентября 2010

Предполагая, что все окончания процесса связаны с созданными вами FIFO, вы не можете просто удалить их из файловой системы?Открытые файловые дескрипторы будут препятствовать удалению FIFO, но новые дескрипторы не могут быть прикреплены к нему, и как только существующие файловые дескрипторы будут закрыты, сам FIFO исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...