2016-01-20 44 views
0

我有一個腳本,雲基本上是這樣的:獲取用戶輸入的程序循環仍然運行

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.那麼,爲什麼每當我按下ENTER鍵時select返回的值都會變爲1?

+1

我建議你使用[IO :: Select](http://metacpan.org/module/IO::Select)模塊來代替,它將'select'調用包裝在一個更加整潔的API中 – Borodin

回答

1

select返回最高的文件描述符+ 1,以防通知某些文件描述符。因此,如果STDIN中沒有任何內容,則爲0,如果有一些字節等待讀取(請注意STDIN爲fd 0因此0+1爲1 - 返回值)。

相關問題