代码之家  ›  专栏  ›  技术社区  ›  Greg Bacon

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

  •  12
  • Greg Bacon  · 技术社区  · 14 年前

    与…比较 diff 从一个文件中相邻的记录,我创建了两个 FIFOs ,分叉子对象以提供其写入端,并捕获

    diff -ub $previous $current
    

    scalars包含fifos路径 bash process substitution 作品。

    这不是一个需要防弹的程序,但如果是,我如何创建临时FIFO以避免 race conditions 还有其他的弱点?想象 File::Temp 有一个 File::Temp::FIFO 表弟:后者的实现是什么?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Michael Krebs    14 年前

    如何创建一个临时目录(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";
    
        2
  •  3
  •   zigdon    14 年前

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