我一直很欣赏 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