#topicpath ///////////////////////////////////////////////////////////////////////////////// * 目次 [#k9200455] #contents(); ///////////////////////////////////////////////////////////////////////////////// * API [#w3f34007] //=============================================================================== ** signal() [#zff999cc] include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t sighandler); - ''このシステムコールの使用は避け、 代わりに sigaction(2) を使用すること。'' - signal() はシグナル signum の処理方法を handler に設定する。 - handler には、 SIG_IGN、 SIG_DFL、 プログラマが定義した関数 (「シグナル・ハンドラ」) のアドレスの いずれかを指定する。 - 処理方法が SIG_IGN に設定されている場合、そのシグナルは無視される。 - 処理方法が SIG_DFL に設定されている場合、シグナルに関連づけられた デフォルトの動作が行われる (signal(7) 参照)。 - 処理方法として関数が設定されている場合、まず最初に処理方法が ''SIG_DFL'' にリセットされるかそのシグナルのブロックが実行された後、 signum を引き数として handler が呼び出される。ハンドラが起動される際にシグナルがブロックされた場合、 ハンドラが返る際にそのシグナルのブロックが解除される。 - シグナル ''SIGKILL'' と ''SIGSTOP'' は捕捉できず、無視することもできない。 - マルチスレッドプロセスにおける signal() の結果は、指定されていない。 //=============================================================================== ** sigaction() [#nbb8f9b6] - sigaction(2) はシグナル・ハンドラが起動される際の挙動を明示的に制御できる。 - signal() の代わりにこのインターフェイスを使うこと。 #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); - signum には、 ''SIGKILL'' と ''SIGSTOP'' 以外の有効なシグナルをどれでも指定できる。 //=============================================================================== ** sigprocmask() [#u37b10a0] - シグナル提供中に割り込みできるシグナルをセットする #include <signal.h> int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); //=============================================================================== ** pthread_sigmask() [#t0b6beda] - 禁止するシグナルマスクの確認と変更を行う #include <signal.h> int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset); - -pthread を付けてコンパイルとリンクを行う。