0

私は2つの方法で終了できるプログラムを作成しました。ユーザーが「kill」という文字列を入力するか、特定のスレッドがSIGINTに信号を送ります。

このターミネータースレッドには、(「kill」をキャッチするための)ステートメントがあります。

    $a = <>;

'return;'が続きます 上部にも適切なシグナルハンドラー(INT用)があります。

print "signal received\n";
threads->exit(); 

ただし、自動終了の場合(つまり、SIGINTが他のスレッドから送信される場合)、待機時間に関係なく、キーを押すまで印刷stmtは表示されません。<>がブロックしていると思います。

誰かが、結果をすぐに確認できるように、自動終了の場合に<>に何らかの入力を提供する方法を教えてください。

ありがとう。

4

1 に答える 1

1

やろうとしていることを、やろうとしている方法で行うことはできません。ファイルが読み取られていて、「入力が保留中」の場合、プロセスは中断できない待機状態になります。基本的に、この時点でシグナリングを介して中断することはできません。中断のない待機はカーネルの問題であり、重要なポイントはファイルの破損を防ぐことです。

あなたがやろうとしていることを行うには、おそらくIO::Selectcan_read関数のようなものを利用する必要があります。ポーリング ループで、どのファイルハンドルが IO の準備ができているかをテストできます。このポーリング ループ、kill シグナルによって中断できます。

または、ファイルハンドルの読み取りを使用する代わりにTerm::ReadKey、非ブロッキング方式でキープレスをトラップできる which を使用できます。

于 2015-04-24T19:48:11.123 に答える