perl-5.40.0
%SIG

The hash %SIG contains signal handlers for signals. For example:

ハッシュ %SIG にはシグナルのためのシグナルハンドラが含まれています。 例えば:

    sub handler {   # 1st argument is signal name
        my($sig) = @_;
        print "Caught a SIG$sig--shutting down\n";
        close(LOG);
        exit(0);
    }
    sub handler {   # 最初の引数はシグナル名
        my($sig) = @_;
        print "Caught a SIG$sig--shutting down\n";
        close(LOG);
        exit(0);
    }
    $SIG{'INT'}  = \&handler;
    $SIG{'QUIT'} = \&handler;
    ...
    $SIG{'INT'}  = 'DEFAULT';   # restore default action
    $SIG{'QUIT'} = 'IGNORE';    # ignore SIGQUIT
    $SIG{'INT'}  = \&handler;
    $SIG{'QUIT'} = \&handler;
    ...
    $SIG{'INT'}  = 'DEFAULT';   # デフォルトの動作を復元
    $SIG{'QUIT'} = 'IGNORE';    # SIGQUIT を無視

Using a value of 'IGNORE' usually has the effect of ignoring the signal, except for the CHLD signal. See perlipc for more about this special case. Using an empty string or undef as the value has the same effect as 'DEFAULT'.

'IGNORE' という値は通常はシグナルの効果を無視するために使いますが、 CHLD シグナルは例外です。 この特別な場合に関する詳細は perlipc を参照して下さい。 値として空文字列や undef を使うのは 'DEFAULT' と同じ効果です。

Here are some other examples:

以下にその他の例を示します:

    $SIG{"PIPE"} = "Plumber";   # assumes main::Plumber (not
                                # recommended)
    $SIG{"PIPE"} = \&Plumber;   # just fine; assume current
                                # Plumber
    $SIG{"PIPE"} = *Plumber;    # somewhat esoteric
    $SIG{"PIPE"} = Plumber();   # oops, what did Plumber()
                                # return??
    $SIG{"PIPE"} = "Plumber";   # main::Plumber を仮定します(非推奨)
    $SIG{"PIPE"} = \&Plumber;   # 問題なし; カレントの Plumber を仮定します
    $SIG{"PIPE"} = *Plumber;    # 少々難解
    $SIG{"PIPE"} = Plumber();   # げげ、Plumber() は何を返すの??

Be sure not to use a bareword as the name of a signal handler, lest you inadvertently call it.

裸の単語をシグナルハンドラの名前として使わないようにしてください; 不注意で呼び出すのを避けるためです。

Using a string that doesn't correspond to any existing function or a glob that doesn't contain a code slot is equivalent to 'IGNORE', but a warning is emitted when the handler is being called (the warning is not emitted for the internal hooks described below).

既存の関数に対応しない文字列や、コードスロットを含んでいないグロブを 使うのは、'IGNORE' と等価ですが、ハンドラが呼び出されると警告が 発生します(後述する内部フックでは警告は発生しません)。

If your system has the sigaction() function then signal handlers are installed using it. This means you get reliable signal handling.

システムに sigaction() 関数がある場合は、シグナルハンドラはそれを使って インストールされます。 これにより、信頼性のあるシグナルハンドリングが可能になります。

The default delivery policy of signals changed in Perl v5.8.0 from immediate (also known as "unsafe") to deferred, also known as "safe signals". See perlipc for more information.

デフォルトのシグナル配送ポリシーは Perl v5.8.0 に即時("unsafe"としても 知られます)から保留(「安全なシグナル」としても知られます)に変更されました。 さらなる情報については perlipc を参照してください。

Certain internal hooks can be also set using the %SIG hash. The routine indicated by $SIG{__WARN__} is called when a warning message is about to be printed. The warning message is passed as the first argument. The presence of a __WARN__ hook causes the ordinary printing of warnings to STDERR to be suppressed. You can use this to save warnings in a variable, or turn warnings into fatal errors, like this:

ある種の内部フックも %SIG ハッシュを使ってセットされます。 警告メッセージを表示しようとするときに $SIG{__WARN__} で 示されたルーチンが呼び出されます。 警告メッセージは最初の引数として渡されます。 __WARN__ フックがあると、通常の STDERR への警告の出力は行われません。 これを使って、警告メッセージを変数にいれたり、 あるいは以下のようにして警告を致命的エラーに変えたり出来ます:

    local $SIG{__WARN__} = sub { die $_[0] };
    eval $proggie;

As the 'IGNORE' hook is not supported by __WARN__, its effect is the same as using 'DEFAULT'. You can disable warnings using the empty subroutine:

__WARN__ では 'IGNORE' フックには対応していないので、 この効果は 'DEFAULT' を使うのと同じです。 空サブルーチンを使って警告を無効に出来ます:

    local $SIG{__WARN__} = sub {};

The routine indicated by $SIG{__DIE__} is called when a fatal exception is about to be thrown. The error message is passed as the first argument. When a __DIE__ hook routine returns, the exception processing continues as it would have in the absence of the hook, unless the hook routine itself exits via a goto &sub, a loop exit, or a die(). The __DIE__ handler is explicitly disabled during the call, so that you can die from a __DIE__ handler. Similarly for __WARN__.

$SIG{__DIE__} で示されるルーチンは 致命的な例外がまさに投げられようとするときに呼び出されます。 エラーメッセージは最初の引数として渡されます。 __DIE__ フックから戻ると、例外処理はフックがなかったかのように 再開されますが、フックルーチン自体が goto &sub、ループ終了、 die() によって終了した場合を除きます。 __DIE__ ハンドラは呼び出し中は明示的に無効になりますので、 __DIE__ ハンドラから die できます。 __WARN__ も同様です。

The $SIG{__DIE__} hook is called even inside an eval(). It was never intended to happen this way, but an implementation glitch made this possible. This used to be deprecated, as it allowed strange action at a distance like rewriting a pending exception in $@. Plans to rectify this have been scrapped, as users found that rewriting a pending exception is actually a useful feature, and not a bug.

$SIG{__DIE__} は eval() の中でも呼び出されます。 これは決してこのようになることを意図したものではありませんでしたが、 実装上のミスでこれが可能になっていました。 これは以前廃止予定でした; $@ で保留されている例外を書き換えるといった 変わった行動を離れた場所でできるようにしていたからです。 これを修正する計画は破棄されました; 保留されている例外を書き換えるというのは実際有用な機能であることがわかり、 またバグではないからです。

The $SIG{__DIE__} doesn't support 'IGNORE'; it has the same effect as 'DEFAULT'.

$SIG{__DIE__}'IGNORE' に対応していません; これは 'DEFAULT' と同じ効果です。

__DIE__/__WARN__ handlers are very special in one respect: they may be called to report (probable) errors found by the parser. In such a case the parser may be in inconsistent state, so any attempt to evaluate Perl code from such a handler will probably result in a segfault. This means that warnings or errors that result from parsing Perl should be used with extreme caution, like this:

__DIE____WARN__ のハンドラは一つの点で非常に特別です: パーサによってエラー(であろうもの)を報告するために呼び出されることがある ことです。 このような場合、パーサは不安定な状態になっているかもしれないので、 ハンドラから Perl コードを評価しようとするとセグメンテーションフォールトが 発生するかもしれません。 Perl のパース中の警告やエラーは、以下のように非常に注意して扱うべきです;

    require Carp if defined $^S;
    Carp::confess("Something wrong") if defined &Carp::confess;
    die "Something wrong, but could not load Carp to give "
      . "backtrace...\n\t"
      . "To see backtrace try starting Perl with -MCarp switch";

Here the first line will load Carp unless it is the parser who called the handler. The second line will print backtrace and die if Carp was available. The third line will be executed only if Carp was not available.

一行目は、パーサが ハンドラ呼び出したのでなければ Carp を 読み込みます。 二行目 は、Carp が使えるならバックとレースを表示して die します。 三行目は Carp が使えないときにのみ実行されます。

Having to even think about the $^S variable in your exception handlers is simply wrong. $SIG{__DIE__} as currently implemented invites grievous and difficult to track down errors. Avoid it and use an END{} or CORE::GLOBAL::die override instead.

例外ハンドラの中で $^S を使おうなどとは考えてもいけません。 現在の実装の $SIG{__DIE__} は面倒を引き寄せ、エラーの追跡を困難にします。 これの代わりに END{} を使うか、CORE::GLOBAL::die を オーバーライドしてください。

See "die" in perlfunc, "warn" in perlfunc, "eval" in perlfunc, and warnings for additional information.

追加の情報については "die" in perlfunc, "warn" in perlfunc, "eval" in perlfunc, warnings を参照して下さい。