2

SIGINT などの一部のシグナルについては、トラップを簡単にセットアップしてシグナルを処理し、必要に応じて実行を継続できます。^q および ^s の典型的な動作を、いじっている Ruby コマンドライン アプリケーションに追加したいと考えています。これを行う方法はありますか?特に、Windows、iOS、Linux、Solaris で使用できる移植可能な方法はありますか?

編集:

シグナルがプロセスに配信されないことが判明しました。実際、プロセスとその親プロセス (bash インスタンス) で strace を実行すると、プロセスも親プロセスも何が起こっているのかを示す情報を取得していないことがわかりました。彼らは単に停止されています。

1 秒に 1 回起動し、最後のアラームから 1 秒以上経過したかどうかを確認し、プロセスが中断されたと判断した場合は適切な呼び出しを行う SIGALARM ハンドラを作成しようとします。負荷の高いシステムでは、誤検知が発生する可能性があります。

4

2 に答える 2

1

irb に と入力しSignal.listます。トラップできるすべてのシグナルがリストされます。

Ruby でシグナルをトラップします。

Signal.trap("STOP") do
  # handle the signal
end

ターミナルで と入力し$ stty -aます。シグナルと関連するキー コンボ (存在する場合) を一覧表示する必要があります。

^s は通常stop、^q はだと思いますstart

この回答によると、これらのキーの組み合わせは実際には実行中のプロセスにシグナルを送信するのではなく、ターミナルドライバーにシグナルを送信します。その場合、kill -STOP <process>そのシグナルをプロセスに送信できます。

于 2012-09-11T21:05:39.200 に答える