在程序循环中仍然运行用户输入

时间:2016-01-20 02:18:09

标签: perl

我的脚本基本上是这样的:

sub mainLoop {
    while (1) {
        # Do its thing
    }
}

我认为逻辑根本不重要,它基本上经常检查服务器并在必要时执行某些操作。但我想确保用户可以在程序运行时输入一些命令,例如show statusshow 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键?

1 个答案:

答案 0 :(得分:1)

select返回最高文件描述符+ 1,以防通知某些文件描述符。因此,如果0上没有任何内容,则为STDIN,如果有一些字节等待阅读,则为STDIN {注意0为fd 0+1所以{{1} }是1 - 返回值。)