シグナルハンドラを設定する

# pcntl_signal

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

pcntl_signal — シグナルハンドラを設定する

### 説明

pcntl_signal ( int `$signo` , mixed `$signinfo` ) : bool

pcntl_signal() 関数は、`signo` が指すシグナルに関するハンドラを新たに設定するか、既存のハンドラを置き換えます。

### パラメータ

`signo`

  シグナル番号。

`handler`

  シグナルハンドラ。callable を渡すと、それを実行してシグナルを処理します。 あるいは、グローバル定数 `SIG_IGN` または `SIG_DFL` を渡すこともできます。それぞれ、シグナルを無視することとデフォルトのシグナルハンドラを復活させることを表します。

  callable を渡す場合は、次のシグネチャを実装したものでなければいけません。

  handler ( int `$signo` ) : void
  `signo`
    処理するシグナル。
  `siginfo`
    If operating systems supports siginfo_t structures, this will be an array of signal information dependent on the signal.

  > 注意:

  > オブジェクトのメソッドをハンドラとして指定した場合には、 そのハンドラを別のものに変えたりスクリプトが終了したりするまでは オブジェクトの参照カウントが増加しないことに注意しましょう。

`restart_syscalls`

  再起動のシステムコールに対応するかどうかを設定します。

### 返り値

成功した場合に `TRUE` を、失敗した場合に `FALSE` を返します。

### 変更履歴

バージョン | 説明
--- | ---
4.3.0 | PHP 4.3.0 以降、PCNTL はシグナルハンドルコールバックの仕組みとして ticks を使用しており、これは以前の仕組みよりずっと高速です。この変更は "user ticks" を使用するのと同じことです。次の例で示すように、 declare() を使用して プログラム中でコールバックの発生を許可する場所を指定し、シグナルハンドラが 正しく動作するようにする必要があります。
7.1.0 | As of PHP 7.1.0 the handler callback is given a second argument containing the signinfo of the specific signal. This data is only supplied if the operating system has the signinfo_t structure. If the OS does not implement siginfo_t NULL is supplied.

### 例

例1 pcntl_signal() の例

`<?php
// PHP 4.3.0 以降では tick を使用しなければなりません
declare(ticks = 1);
// シグナルハンドラ関数
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
// シャットダウンの処理
exit;
break;
case SIGHUP:
// 再起動の処理
break;
case SIGUSR1:
echo "SIGUSR1 を受け取りました...\n";
break;
default:
// それ以外のシグナルの処理
}
}
echo "シグナルハンドラを設定します...\n";
// シグナルハンドラを設定します
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
// あるいは PHP 4.3.0 以降ならオブジェクトも指定できます
// pcntl_signal(SIGUSR1, array($obj, "do_something"));
echo "自分自身に SIGUSR1 シグナルを送信します...\n";
// SIGUSR1 をカレントのプロセス ID に送信します
// posix_* 関数を使うには posix 拡張モジュールが必要です
posix_kill(posix_getpid(), SIGUSR1);
echo "終了\n";
?>`

### 注意

pcntl_signal() は、既存のシグナルハンドラがある場合にはそれを上書きします。

### 参考

- pcntl_fork() - 現在実行中のプロセスをフォークする
- pcntl_waitpid() - 待つかフォークした子プロセスのステータスを返す