uv_signal_t — シグナルハンドル

シグナルハンドルは、イベントループごとにUnix形式のシグナル処理を実装します。

Windowsに関する注記

一部のシグナルの受信をエミュレートします。

  • SIGINTは、通常、ユーザーがCTRL+Cを押したときに届きます。ただし、Unixと同様に、端末のrawモードが有効な場合は発生しません。

  • SIGBREAKは、ユーザーがCTRL+BREAKを押したときに届きます。

  • SIGHUPは、ユーザーがコンソールウィンドウを閉じたときに発生します。SIGHUPを受けたプログラムには、後処理のために約10秒が与えられます。その後、Windowsは無条件にプログラムを終了します。

  • SIGWINCHは、libuvがコンソールのサイズ変更を検出するたびに発生します。libuvアプリがコンソールエミュレーターで動作している場合や、32ビットのlibuvアプリが64ビットシステムで動作している場合は、SIGWINCHをエミュレートします。この場合、SIGWINCHが常に適時に届くとは限りません。書き込み可能なuv_tty_tハンドルでは、カーソルが移動したときだけサイズの変更を検出します。読み取り可能なuv_tty_tハンドルを使う場合は、ハンドルがrawモードであり、読み取り中の場合にだけ、コンソールバッファーのサイズ変更を検出します。

  • 他のシグナルの監視ハンドルも作成できますが、これらのシグナルを受信することはありません。該当するシグナルは次のとおりです: SIGILL、SIGABRT、SIGFPE、SIGSEGV、SIGTERM、SIGKILL.

  • raise()やabort()でプログラムからシグナルを発生させても、libuvは検出しません。そのため、シグナルの監視ハンドルは反応しません。

バージョン1.15.0での変更: WindowsのSIGWINCHサポートを改善しました。

バージョン1.31.0での変更: 64ビットWindows上の32ビットlibuvのSIGWINCHサポートを、以前の実装へ戻しました。

Unixに関する注記

  • SIGKILLとSIGSTOPは捕捉できません。

  • SIGBUS、SIGFPE、SIGILL、SIGSEGVをlibuvで処理すると、未定義動作になります。

  • SIGABRTをabort()が生成した場合、たとえばassert()経由の場合には、libuvで捕捉しません。

  • Linuxでは、SIGRT0とSIGRT1(シグナル番号32と33)を、NPTLのpthreadsライブラリーがスレッド管理に使います。これらのシグナルの監視ハンドルを設定すると、予測不能な動作が生じるため、強く非推奨とします。将来のlibuvでは、これらを単に拒否する可能性があります。

データ型

type uv_signal_t

シグナルハンドルの型です。

typedef void (*uv_signal_cb)(uv_signal_t *handle, int signum)

次の関数へ渡すコールバックの型定義です: uv_signal_start()。

公開メンバー

int uv_signal_t.signum

このハンドルが監視するシグナルです。読み取り専用です。

関連項目

次の型のuv_handle_tメンバーも適用されます。

API

int uv_signal_init(uv_loop_t *loop, uv_signal_t *signal)

ハンドルを初期化します。

int uv_signal_start(uv_signal_t *signal, uv_signal_cb cb, int signum)

指定したコールバックでハンドルを開始し、指定したシグナルを監視します。

int uv_signal_start_oneshot(uv_signal_t *signal, uv_signal_cb cb, int signum)

バージョン1.12.0で追加。

次の関数と同じ機能ですが、uv_signal_start()とは異なり、シグナルを受信した時点でシグナルハンドラーをリセットします。

int uv_signal_stop(uv_signal_t *signal)

ハンドルを停止します。以後、コールバックを呼び出しません。

関連項目

次の型のuv_handle_tAPI関数も適用されます。