我的脚本基本上是这样的:
sub mainLoop {
while (1) {
# Do its thing
}
}
我认为逻辑根本不重要,它基本上经常检查服务器并在必要时执行某些操作。但我想确保用户可以在程序运行时输入一些命令,例如show status
或show foo
。并打印一些内容,例如它必须采取行动的次数等。总而言之,它需要从STDIN读取而不会暂停循环。
我读了另一个执行此操作的Perl程序的源代码。但我不确定我是否明白:
sub mainLoop {
while (1) {
# This is just for the sake of of this example
my $bits = '';
my $line = undef;
vec($bits, fileno(STDIN), 1) = 1;
if (select($bits, undef, undef, 0) > 0) {
$line = <STDIN>;
$line =~ s/\n//g;
}
if ($line) {
# I can work with $line value and call a sub based on its value
}
# Keep on doing its thing
}
}
我没有得到select()
。它如何变为大于0的值?因为我可以告诉$bits
的值是否相同select()
是否具有等于0或大于0的值。那么为什么每次我选择返回的值都会更改为1点击ENTER键?
答案 0 :(得分:1)
select
返回最高文件描述符+ 1,以防通知某些文件描述符。因此,如果0
上没有任何内容,则为STDIN
,如果有一些字节等待阅读,则为STDIN
{注意0
为fd 0+1
所以{{1} }是1 - 返回值。)