古い良い alarm() 呼び出しの時代が終わったように見えるので、これらのブロック呼び出しを行うコードを想定して、perl スレッド (その真新しい「スレッド」モジュールを使用) から作成された read() および write() のブロックを中断する方法変えられない?実際の問題は Modbus デバイスとの通信が滞っていることなので、RS-485 地獄に陥らないように簡単なテストケースを作成しました。
use threads;
use IO::Handle;
threads->create(sub {
$io = IO::Handle->new_from_fd(fileno(STDIN), 'r') or die;
$br = read $io, $buf, 100;
warn "read: $br";
});
while(1) {threads->yield()};
ここでは、キーボードで Ctrl-D を押さない限り warn() は実行されません。read() 呼び出しをタイムアウトする簡単な解決策はありますか?