sigaction() - シグナル・アクションの検査/変更

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方

POSIX(ON)

形式

#define _POSIX_SOURCE
#include <signal.h>

int sigaction(int sig, const struct sigaction *__restrict__ new, 
              struct sigaction *__restrict__ old);

機能説明

特定シグナルと関連したアクションの検査および変更を行い ます。

int sig は、認識されたシグナル数 です。sigaction() は、このシグナル と関連するアクションの検査および設定を行います。z/OS®UNIX サービスによってサポートされるシグナルと同様、sig の値については、表 1 を参照してください。sig 引数は、signal.h ヘッダー・ファイルで定義される マクロの 1 つであることが必要です。

const struct sigaction *new は 、NULL ポインターになる場合があります。その場合、sigaction() は、sig を処理するために 現在定義されているアクションの判別だけを行います。このアクションが変更されるわけではありません。new が NULL ではない場合には 、これで sigaction 構造体を示す必要があります。この構造体で指定されたアクションは、sig と関連した 新規アクションになります。

struct sigaction *old は、sigaction() が sigaction 構造体を保管できるメモリー位置を指します。sigaction() は、このメモリー位置を使って 現在 sig と関連しているアクションが記述されている sigaction 構造体を保管します。また、old は NULL ポインターとして使用することもできます。この場合、sigaction() は、この情報を保管しません。

この関数がサポートされるのは、POSIX プログラムだけです。

C++ の特殊な動作:
  • シグナル処理と C++ 例外処理が混在している場合は、動作は未定義です。また、コンストラクターおよびデストラクターでのシグナル処理の使用も未定義です。
  • C++ および C 言語のリンケージ規約は非互換です。したがって、sigaction() は C++ 関数のポインターを受け取れません。C++ 関数ポインターを sigaction() へ渡そうとすると、コンパイラーが、エラーとしてこれにフラグを付けることになります。したがって、C++ 言語で sigaction() 関数を使用するには、確立されたシグナル・ハンドラー・ルーチンを extern "C" と宣言することによって、必ずこれらのルーチンに C リンケージが含まれるようにしなければなりません。
シグナル: 表 1 は、シグナル値およびそれらのデフォルト・アクションと意味をリストしています。
表 1. z/OSUNIX サービスによってサポートされるシグナル値とシグナル
デフォルト・アクション 意味
SIGABND 1 異常終了
SIGABRT 1 異常終了 (abort() によって送信)
SIGALRM 1 タイムアウト・シグナル (alarm() によって送信)
SIGBUS 1 バス・エラー (MVS™ 5.2 またはそれ以上での実行時にのみ使用可能)
SIGFPE 1 オーバーフロー、ゼロによる割り算、および誤った演算などの、マスクされない算術例外
SIGHUP 1 制御端末が中断されるか、または制御プロセスが終了した
SIGILL 1 誤った関数イメージの検出
SIGINT 1 対話式アテンション
SIGKILL 1 取得できないか、または無視できない終了シグナル
SIGPIPE 1 読み取り中ではないパイプへの書き込み
SIGPOLL 1 ポーリング可能イベントが発生した (MVS 5.2 またはそれ以上での実行時にのみ使用可能)
SIGPROF 1 プロファイル・タイマーの有効期限が切れた (MVS 5.2 または それ以上での実行時にのみ使用可能)
SIGQUIT 1 端末の終了シグナル
SIGSEGV 1 メモリーへの誤ったアクセス
SIGSYS 1 誤ったシステム呼び出しが発行された (MVS 5.2 またはそれ以上での実行時にのみ使用可能)
SIGTERM 1 プログラムへ送信された終了要求
SIGTRAP 1 dbx または ptrace による内部使用目的
SIGURG 2 高帯域幅データがソケットで使用可能 (MVS 5.2 またはそれ以上での実行時にのみ使用可能)
SIGUSR1 1 ユーザー・アプリケーションによる使用目的
SIGUSR2 1 ユーザー・アプリケーションによる使用目的
SIGVTALRM 1 仮想タイマーの有効期限が切れた (MVS 5.2 またはそれ以上での実行時にのみ使用可能)
SIGXCPU 1 CPU 時間制限の超過 (MVS 5.2 またはそれ以上での実行時にのみ使用可能)。 プロセスの CPU 時間がなくなり、SIGXCPU が取得されるか、または無視されると、SIGKILL が生成される。
SIGXFSZ 1 ファイル・サイズの限界を超過。
SIGCHLD 2 終了または停止された子プロセス (SIGCLD は、このシグナルの別名)
SIGIO 2 入力または出力の完了
SIGIOERR 2 重大な入出力エラーが検出された。
SIGWINCH 2 ウィンドウ・サイズが変更された (MVS 5.2 またはそれ以上での実行時にのみ使用可能)
SIGSTOP 3 取得できないか、または無視できないストップ・シグナル
SIGTSTP 3 端末のストップ・シグナル
SIGTTIN 3 制御端末から読み取ろうとしたバックグラウンド・プロセス
SIGTTOU 3 制御端末へ書き込もうとしたバックグラウンド・プロセス
SIGCONT 4 続行 (停止した場合)
表 1デフォルト・アクションは、以下のとおりです。
1
プロセスの正常終了。
2
シグナルの無視。
3
プロセスの停止。
4
現在停止している場合には、プロセスを続行。そうでない場合には、シグナルを無視。

オペレーティング・システムまたはアプリケーションで検出もしくは処理できない方法でメインプログラムが異常終了すると、z/OSUNIX は、実行中のアプリケーションを KILL -9 で終了します。z/OSUNIX が EOT または EOM の制御を取得し、さらに終了状況が設定されていない場合、z/OSUNIX は、KILL -9 が発生した場合と同じ終了状況を設定します。

プログラム・チェックもしくは ABEND の結果、シグナル SIGABND、SIGFPE、 SIGILL、または SIGSEGV のシグナル・キャッチャーが起動して、そのシグナル・キャッチャーが RETURN ステートメントを実行すると、プロセスは終了します。

sigaction 構造体: sigaction 構造体は、以下のように定義されます。
             struct sigaction {
                   void       (*sa_handler)(int);
                   sigset_t   sa_mask;
                   int        sa_flags;
                   void       (*sa_sigaction)(int, siginfo_t *, void *);
             };
以下は構造体のメンバーです。
void (*)(int) sa_handler
シグナルを処理するために割り当てられる関数へのポインター。また、このメンバーの値は、SIG_DFL (デフォルト・アクションを 指示) または SIG_IGN (シグナルが無視されることを指示) にも することができます。

XPG4.2 の特殊な動作: この メンバーおよび sa_sigaction は、相互に排他的です。SA_SIGINFO フラグが sa_flags に設定 されるときは、sa_sigaction が使用されます。そうで ない場合には、sa_handler が使用されます。

sigset_t sa_mask
シグナル処理関数 sa_handler または (XPG4.2 の) sa_sigaction が起動される前に、呼び出しプロセスのシグナル・マスクに追加されるシグナル・セットが、シグナル・セットにより識別されます。シグナル・セットの詳細は、sigemptyset() - 全シグナルを除外するためのシグナル・マスクの初期化を参照してください。このメカニズムを使用して、SIGKILL、SIGSTOP、または SIGTRACE を ブロックすることはできません。sa_mask にこれらのシグナルがインクルードされている場合には、単に 無視されます。sigaction() はエラーを戻しません。

sa_mask は、sigemptyset()、sigfillset()、sigaddset()、および sigdelset() といったシグナル・セット操作関数 (1 つ以上) を使って設定する必要があります。

int sa_flags
シグナルの動作に影響を与えるフラグ・ビットのコレクション。次のフラグ・ビットは、sa_flags に設定できます。
_SA_IGNORE
このビットが出力されるだけであり、アプリケーションでこのビットを指定することは できません。ハンドラー値は保管され、以降の呼び出しで戻されますが、シグナルは無視されます。
SA_NOCLDSTOP
子プロセスが停止している際には、SIGCHLD シグナルを 発行しないようにシステムに通知します。これが妥当なのは、sigaction() の sig 引数が SIGCHLD のときだけです。
SA_NOCLDWAIT
子プロセスが停止する際には、'zombie' プロセスを作成しない ように、システムに通知します。これが妥当なのは、sigaction() の sig 引数が SIGCHLD のときだけです。呼び出しプロセス が以後にその子を待機し、このプロセスに zombie プロセス に変換された子への未待機がない場合には、子のすべてが終了 するまで、ブロックされます。wait()、waitid()、または waitpid() で障害が発生し、errno が ECHILD に 設定されます。
SA_NODEFER
シグナル・ハンドラー関数の起動時に、このシグナルを自動的 にブロック化してバイパスするように、システムに通知します。
_SA_OLD_STYLE
C ランタイム・ライブラリーに、POSIX 規則の代わりに ANSI シグナル 送達規則を使用するように通知します。これは、シグナル・アクションを設定する signal() を使用する アプリケーションとの互換性についてサポートされています (signal() - 割り込みの処理を参照してください)。ANSI および POSIX.1 シグナル送達規則については、「z/OS XL C/C++ プログラミング・ガイド」の『エラー条件およびシグナルの処理』を参照してください。
SA_ONSTACK
シグナル・ハンドラー関数の起動時には、代替シグナル・スタック (sigaltstack() - シグナル代替スタック・コンテキストの設定または取得または sigstack() - シグナル・スタック・コンテキストの設定または取得を参照) を 使用するようにシステムに通知します。代替シグナル・スタックが宣言 されていなかった場合には、シグナル・ハンドラー関数が、現行 スタックで起動されます。
SA_RESETHAND
シグナル・ハンドラー関数の起動前に、シグナルのアクション を SIG_DFL にリセットし、SA_SIGINFO フラグをクリアするように、システムに通知します (注: SIGILL および SIGTRAP を、送達時に自動的にリセットすることはできません。ただし、この 状態が存在していれば、エラーは生成されません)。そうでない場合には、シグナルの後処理は、エントリーで シグナル・ハンドラーに変更されません。

さらに、このフラグが設定されると、sigaction() は、あたかも SA_NODEFER フラグも設定されたかのように作動します。

SA_RESTART
一定のライブラリー関数がシグナルで割り込まれた場合には、これらを再始動させるようにシステムに通知します。この再始動の 可能性が適用される関数はすべて、シグナルによる割り込み可能 と定義され、errno が EINTR (pause()、sigpause()、および sigsuspend() を除く) に設定されます。
表 2 は、シグナルによって割り込まれた場合に再始動可能な関数をリストしています。
表 2. シグナルによって割り込まれた場合に再始動可能な関数
accept() fstatvfs() recvmsg()
catclose() fsync() select()
catgets() ftruncate() semop()
chmod() getgrgid() send()
chown() getgrnam() sendmsg()
close() getmsg() sendto()
closedir() getpass() statvfs()
connect() getpwnam() tcdrain()
creat() getpwuid() tcflow()
dup2() ioctl() tcflush()
endgrent() lchown() tcgetattr()
fchmod() lockf() tcgetpgrp()
fchown() mkfifo() tcsendbreak()
fclose() msgrcv() tcsetattr()
fcntl() msgxrcv() tcsetpgrp()
fflush() msgsnd() tmpfile()
fgetc() open() umount()
fgetwc() poll() wait()
fopen() putmsg() waitid()
fputc() read() waitpid()
fputwc() readv() write()
freopen() recv()  
fseek() recvfrom()  
SA_SIGINFO
sa_handler の代わりに sa_sigaction に よって指定されたシグナル・アクションを使用するように、システム に通知します。
このフラグがオフで、アクションでシグナルを取得できる 場合には、sa_handler により指定された シグナル・ハンドラー関数が次のように起動されます。

   void  function(int signo);

ここでは、signo はシグナル・ハンドラーの唯一の引数 で、これにより、シグナル・ハンドラー関数を起動させたシグナル のタイプが指定されます。
このフラグがオンで、アクションでシグナルを取得する 場合には、sa_sigaction により指定された シグナル・ハンドラー関数が次のように起動されます。

   void  function(int signo, siginfo_t *info, void *context);

ここでは、追加の 2 つの引数がシグナル・ハンドラー関数に 渡されます。2 番目の引数は NULL ポインターではない場合には、シグナルのソースに関する追加情報を提供する タイプ siginfo_t のオブジェクトを示します。siginfo_t オブジェクトは、以下のメンバーを含む構造体です。
si_signo
システム生成シグナル番号を含みます。
si_errno
インプリメンテーション特定エラー情報を含みます (この インプリメンテーションでは使用されません)。
si_code
シグナルの原因を識別するコードを含みます (これらのコードのリストについては、<signal.h> 組み込みファイルを、それらの意味については、表 1 を参照してください)。

si_signo に SIGPOLL が含まれていると、si_code を SI_ASYNCIO に設定することができます。その他の場合、si_code の値がゼロ以下であるときには、シグナルは別のプロセスによって生成されており、si_pid および si_uid メンバーにはそれぞれ、このシグナルの送信側のプロセス ID および実ユーザー ID が示されます。

si_code の値がゼロより小さいか等しい場合には、シグナルは別のプロセス によって生成されており、si_pid および si_uid メンバーではそれぞれ、このシグナルの送信側のプロセス ID および 実ユーザー ID が示されます。

si_pid
si_code の値がゼロより小さいか等しい場合には、このメンバーで、このシグナルの送信側のプロセス ID が示され ます。それ以外の場合には、このメンバーは無意味です。
si_uid
si_code の値がゼロより小さいか等しい場合には、このメンバーで、このシグナルの送信側の実ユーザー ID が示され ます。それ以外の場合には、このメンバーは無意味です。
si_value
si_code が SI_ASYNCIO の場合、si_value にはアプリケーション指定値が設定されます。その他の場合、si_value の値は未定義です。
3 番目の引数では、型 ucontext_t のオブジェクト が示されます (このオブジェクトの内容の説明については 、<ucontext.h> 組み込みファイルを参照してください)。
注: 残りのフラグ・ビットは、システム使用のために予約 されています。"int sa_flags" の整数値が、sigaction() からの戻り時に同じ値である保証はありません。ただし、前述の定義されたすべてのフラグ・ビットは未変更のままになります。
void (*)(int, siginfo_t *, void *) sa_sigaction
シグナル、または SIG_DFL か SIG_IGN を処理するために割り当てられた関数へのポインター。3 つのパラメーターが渡され、この関数が起動されます。最初の パラメーターは、この関数がそのために起動中のシグナル・タイプ を含む型 'int' です。2 番目は、siginfo_t に、シグナル のソースに関する追加情報が含まれている 型 'pointer to siginfo_t' のパラメーターです。3 番目のパラメーターは、型 'pointer to void' で、実際には、シグナル割り込みの時間のコンテキスト情報を含 む ucontext_t を示します。
注 :
  1. ユーザーは SIG_IGN または SIG_DFL をキャストして 、sa_sigaction 定義を一致させることが必要です (シグナルが無視されることを表示します)。
  2. XPG4.2 の特殊な動作: この メンバーおよび sa_handler は、相互に排他的です。SA_SIGINFO フラグが sa_flags に設定 されるときは、sa_sigaction が使用されます。そうで ない場合には、sa_handler が使用されます。

_SA_OLD_STYLE フラグがオフに設定された sigaction() によって インストールされたシグナル・ハンドラーがシグナルをキャッチした場合には、システムは、現行シグナル・マスク、sa_mask によって指定されたシグナル、およびキャッチしたばかりのシグナル (A_NODEFER フラグが設定されていない 場合) の共用体をとることによって、新しいシグナル・マスクを計算します。シグナル・ハンドラーが戻されるか、または sigprocmask()、sigsuspend()、siglongjmp()、sighold()、sigpause()、および sigrelse() のいずれかが呼び出されるまで、この新規マスクは有効のままです。シグナル・ハンドラーが終了する際に、オリジナルの シグナル・マスクが復元されます。

sigaction() または signal() を使用してアクションを特定の シグナルについて指定すると、sigaction()、signal()、および exec 関数のいずれか 1 つ、bsd_signal()、 sigignore()、もしくは sigset() の呼び出しで明示的に変更されるまで、または SA_RESETHAND フラグによって SIG_DFL にリセットされるまで、そのアクションは有効 です。

SA_OLD_STYLE フラグが設定されていない状態で、sigaction() を 使用して、アクションが特定のシグナルに指定された後では 、sigaction()、signal()、または exec 関数の 1 つへの別の呼び出しで明示的に変更されるまで、そのアクションは有効です。

SA_OLD_STYLE フラグが設定されている状態で、sigaction() を 使用して、または signal() を使用して、アクションを特定の シグナルについて指定すると、sigaction()、 signal()、または exec 関数の 1 つへの別の呼び出しで明示的に変更されるか、あるいはシグナル・キャッ チャーが駆動される (この場合は SIG_DFL に再設定されます) まで、そのアクションは有効です。

保留中のシグナルの SIG_IGN へのシグナル・アクションの 正常な設定によって、ブロックされているかどうかにかかわらず、保留シグナルが廃棄されます。これで、ブロック化が検出され、sigpending() によって保留中の シグナルを廃棄する機能が提供されます。

XPG4.2 の特殊な動作:
  • プロセスにより、SIGCHLD シグナルのアクションが SIG_IGN に 設定されると、呼び出しプロセスの子プロセスは、終了時に、'zombie' プロセスに変換されません。呼び出しプロセス が以後にその子を待機し、このプロセスに 'zombie' プロセス に変換された子に対する未待機がない場合には、子のすべてが終了 するまでブロックされます。wait()、waitid()、または waitpid() 関数で障害が起こり、errno が ECHILD に 設定されます。
  • SA_SIGINFO フラグが設定される場合には 、sa_sigaction によって指定されるシグナル・キャッチング関数が 次のように起動されます。

           void  function(int signo, siginfo_t *info, void *context);

    ここでは、function は指定されたシグナル・キャッチング関数であり、signo は送達中のシグナルのシグナル番号です。info は、送達中のシグナルと関連した 型 siginfo_t のオブジェクトを指します。context は、型 ucontext_t の オブジェクトを指します。

非同期シグナル・キャッチング関数の考慮事項:一部の関数は、非同期シグナルに関しては、逐次再使用が可能に なるように制限されています。つまり、ライブラリーでは、非同期シグナルによりこれらの 関数の 1 つの実行が、完了前に割り込まれることは許可されて いません。

シグナル・キャッチング関数が非同期に起動される際には、この制限を考慮する必要があります。これが原因で、一部の ライブラリー関数の動作が予測不可能になるからです。

したがって、厳密に準拠した POSIX C または X/Open アプリケーション を作成中の場合には、次の関数だけが非同期シグナルに関しては 再入可能と想定する必要があります。ユーザーの シグナル・キャッチング関数では、次の関数だけを使用してくだ さい。
access() alarm() cfgetispeed()
cfgetospeed() cfsetispeed() cfsetospeed()
chdir() chmod() chown()
close() creat() dup()
dup2() execle() execve()
_exit() fcntl() fork()
fstat() getegid() geteuid()
getgid() getgroups() getpgrp()
getpid() getppid() getuid()
kill() link() lseek()
mkdir() mkfifo() open()
pathconf() pause() pipe()
pthread_cond_broadcast() pthread_cond_signal() pthread_mutex_trylock()
read() rename() rmdir()
setgid() setpgid() setsid()
setuid() sigaction() sigaddset()
sigdelset() sigemptyset() sigfillset()
sigismember() sigpending() sigprocmask()
sigsuspend() sleep() stat()
sysconf() tcdrain() tcflow()
tcflush() tcgetattr() tcgetpgrp()
tcsendbreak() tcsetattr() tcsetpgrp()
time() times() umask()
uname() unlink() utime()
wait() waitpid() write()
XPG4.2 の特殊な動作: 以下の関数を、厳密に準拠した X/Open アプリケーションのシグナル・キャッチング 関数で使用される場合がある、上記の関数のリストに追加します。
  • fpathconf()
  • raise()
  • signal()

getc() および putc() のマクロ・バージョンは、たとえ これらの関数のライブラリー・バージョンが再入可能でも、再入不可能です。

移植不可能な POSIX アプリケーションでは、大部分の ライブラリー関数はシグナル・キャッチング関数で使用できます。ただし、以下の関数は使用しないでください。
  • getenv()
  • getgrent()
  • getgrgid()
  • getgrnam()
  • getpwent()
  • getpwnam()
  • getpwuid()
  • ttyname()
XPLINK コンパイル C++ の特殊な動作: setjmp.h および ucontext.h に関連する制約事項は、以下のとおりです。
  1. Language Environment® V2R10 以降のライブラリーと共に実行され、jmp_bufsigjmp_buf、または ucontext_t の型を使用する、V2R10 以降の C コンパイラーでコンパイルされたすべての XPLINK プログラムは、Language Environment V2R9 以前からの C ヘッダーを付けてコンパイルすることはできません。
  2. いずれかのレベルの Language Environment ヘッダーを付けてコンパイルされた XPLINK 以外の関数は、jmp_bufsigjmp_buf、または ucontext_t のデータ項目を定義し、これらの渡されたデータ項目をもった getcontext()、longjmp()、 _longjmp()、setjmp()、_setjmp()、setcontext()、sigsetjmp()、または swapcontext() を 呼び出す XPLINK 関数に、それらのデータ項目を渡すことはできません。
  3. __XPLINK__ が定義されると、Language Environment V2R10 およびそれ以降のヘッダーは、setjmp()、getcontext()、および関連した関数が XPLINK ルーチンから呼び出される際に、これらの関数によって必要とされるより大きな jmp_bufsigjmp_buf、または ucontext_t の領域を定義します。__XPLINK__ が定義されないと、Language Environment V2R10 およびそれ以降のヘッダーは、より小さい jmp_bufsigjmp_buf、または ucontext_t の領域を定義します。V2R10 より前の Language Environment ヘッダーも、これらのデータ域がより小さいバージョンを定義します。XPLINK 関数が、小さい jmp_bufsigjmp_buf、または ucontext_t の領域を 持った setjmp()、getcontext()、または類似の関数を呼び出す場合、渡された (小さすぎる) データ域の終端を超えて C ライブラリーを保管しようとすると、ストレージ・オーバーレイまたはプログラム・チェックが発生する場合があります。
  4. sigaction() 関数は signal() インターフェースに代わるものであり、優先的に使用する必要があります。特に、sigaction() と signal() を同じプロセスで使用し、同じシグナルを制御することはできません。

使用上の注意

この関数では、SIGTHSTOP および SIGTHCONT シグナルの使用はサポートされていません。

戻り値

正常に実行された場合、sigaction() は 0 を戻します。

正常に実行されなかった場合、新規シグナル・ハンドラーはインストールされないで、sigaction() は -1 を戻し、errno を以下の値のいずれかに設定します。
エラー・コード
説明
EINVAL
これは 次の理由の 1 つで、sig の値が無効シグナルである ことを示しています。
  • sig が認識されていない。
  • 無視できないシグナルを、プロセスで無視しようとしている。
  • キャッチできないシグナルを、プロセスでキャッチしようと している。

SIGCHILD および SIGIO のデフォルト・アクションは、無視されるシグナルのためのものです。SIGIO の SIG_IGN にアクションを設定する sigaction() は、エラー (errno が EINVAL に設定される) になります。

CELEBS13
⁄* CELEBS13

   The first part of this example determines whether the SIGCHLD
   signal is currently being ignored.
   With a NULL pointer for the new argument, the current signal
   handler action is not changed.

 *⁄
#define _POSIX_SOURCE
#define _XOPEN_SOURCE_EXTENDED 1
#include <stdio.h>
#include <signal.h>

void main(void) {
struct sigaction info;

if (sigaction(SIGCHLD,NULL,&info) != -1)
    if (info.sa_handler == SIG_IGN)
        printf("SIGCHLD being ignored.¥n");
    else if (info.sa_handler == SIG_DFL)
            printf("SIGCHLD being defaulted.¥n");
}
CELEBS14
⁄* CELEBS14

   This fragment initializes a sigaction structure to specify
   mysig as a signal handler and then sets the signal handler
   for SIGCHLD.
   Information on the previous signal handler for SIGCHLD is
   stored in info.

 *⁄
#define _XOPEN_SOURCE_EXTENDED 1
#include <signal.h>
#include <stdio.h>
void mysig(int a) { printf("In mysig¥n"); }

void main(void) {
   struct sigaction info, newhandler;

   if (sigaction(SIGCHLD,NULL,&info) != -1)
       if (info.sa_handler == SIG_IGN)
           printf("SIGCHLD being ignored.¥n");
       else if(info.sa_handler == SIG_DFL)
           printf("SIGCHLD being defaulted.¥n");

   newhandler.sa_handler = &mysig;
   sigemptyset(&(newhandler.sa_mask));
   newhandler.sa_flags = 0;
   if (sigaction(SIGCHLD,&newhandler,&info) != -1)
       printf("New handler set.¥n"); }

関連情報