Goto the Last Fifo

楽土

我一直很欣赏 sysfs 的优雅。你把一个文本写到一个文件里,然后和运行在内核空间的函数对话。只要你知道如何处理文件,你就可以改变系统的行为和重用访问控制机制,而不需要任何特殊的工具。脚本和转储(部分)系统状态是非常容易的。

Linux 和朋友们自带的 fifos 也有同样的作用。创建一个 fifo,设置访问权限,然后开始从那个伪文件中读取。在 Perl 5 中非常容易做到。

my $fifo; open($fifo, "+);
while (<$fifo>) {
    do-things-with $_;
}

Rakudo 对 fifos 还不是很了解,结果在读取一个没有数据的 fifo 时,它并没有阻止。经过一番摸索,我找到了一个解决这个问题的方法。

      1 use v6.c;
      2
      3 # `mkfifo radio-fifo-in`
      4 # `echo "foo" > radio-fifo-in`
      5 # `echo "foo^D" > radio-fifo-in`
      6
      7 my $fifo-in = open(„radio-fifo-in“, :r);
      8
      9 LABEL: loop {
     10     react {
     11         whenever supply { .emit for $fifo-in.lines } {
     12             say .Str;
     13             last LABEL if /‚^D‘/;
     14         }
     15     }
     16 }

我知道了 whenever 反应到 last,今天晚些时候会教给 docs。幸运的是 Perl 6 有了标签,所以我们可以告诉 last 要去哪里。

更新:scovit 发现了一个简短的表达式,它与 Perl 5 的行为非常接近。

my $fifo = open("radio-fifo-in", :r);
while defined $_ = $fifo.get { .say }

by gfldex

comments powered by Disqus