日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
SIGACTION(2) FreeBSD システムコールマニュアル SIGACTION(2) 名称 sigaction -- ソフトウェアシグナル機能 ライブラリ 標準 C ライブラリ (libc, -lc) 書式 #include <signal.h> struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); int sa_flags; /* 下記のシグナルオプション参照 */ sigset_t sa_mask; /* 適用するシグナルマスク */ }; int sigaction(int sig, const struct sigaction * restrict act, struct sigaction * restrict oact); 解説 システムは、プロセスに配信される 1 組のシグナルを定義しています。シグナル の配信は、ハードウェア割り込みの発生に似ています: シグナルは、通常、さら なる発生はブロックされ、現在のスレッドのコンテキストは、保存され、新しい ものが、構築されます。プロセスは、シグナルが配信される handler (ハンドラ) を指定するか、またはシグナルが無視されることを指定します。また、プロセス は、デフォルトのアクションがシグナルが発生するとき、システムによって取ら れることを指定します。また、シグナルは、スレッドのためにブロックされ、そ の場合に、ブロックが解除されるまで、そのスレッドに配信されません。配信で 取られるアクションは、配信のときに決定されます。通常、シグナルハンドラ は、スレッドの現在のスタックで実行します。これは、ハンドラ単位で、変更さ れ、その結果、シグナルは、特別のシグナルスタックに取られます。 通常、シグナルルーチンは、ブロックされた、それらの呼び出しを引き起こした シグナルで実行しますが、他のシグナルは、まだ起こります。グローバルなシグ ナルマスクは、スレッドへの配信から現在ブロックされているシグナルのセット を定義します。スレッドのためのシグナルマスクは、その親 (通常、空) のシグ ナルマスクから初期化されます。それは、sigprocmask(2) または pthread_sigmask(3) 呼び出しか、またはシグナルがスレッドに配信されるとき、 変更されます。 シグナル状態がプロセスまたはスレッドのために発生するとき、シグナルは、プ ロセスまたはスレッドのための保留中のシグナルのセットに追加されます。シグ ナルが、一般的にプロセス、または特定のスレッドに向けられるかどうかは、そ れが、どのように生成されるかに依存します。特定のスレッドに向けられたシグ ナルに関して、シグナルが、スレッドによって現在グロックされていないなら、 それは、スレッドに配信されます。プロセス向けられたシグナルに関して、シグ ナルが、すべてのスレッドによって、現在グロックされていないなら、(その選択 が、指定されていない) ブロックされていない 1 つのスレッドに配信されます。 シグナルは、スレッドがオペレーティングシステムに入るときはいつでも (例え ば、システムコール、ページフォルトまたはトラップ、またはクロック割り込み の間に) 配信されます。複数のシグナルが同時に配信される準備ができているな ら、トラップによって起こされるあらゆるシグナルは、最初に配信されます。追 加のシグナルは、それらの最初の命令の前に、以前のシグナルのためのハンドラ を割り込むように現れるたびに同時に処理されます。保留中のシグナルの集合 は、sigpending(2) システムコールによって返されます。捕獲されたシグナルが 配信されるとき、スレッドの現状が状態は、保存され、新しいシグナルマスク は、(以下に説明されるように) 計算され、シグナルハンドラが、呼び出されま す。ハンドラへの呼び出しは、シグナルの処理ルーチンが正常に返るなら、ス レッドが、シグナルの配信の前に、コンテキストで実行を再開できるように、手 配されます。スレッドが、異なるコンテキストで再開することを望むなら、それ は、前のコンテキスト自体を復元するように手配しなければなりません。 シグナルがスレッドに配信されるとき、新しいシグナルマスクは、プロセスのシ グナルハンドラの存続期間に (または、sigprocmask(2) システムコールが行われ るまで) 保持されます。このマスクは、現在のシグナルマスクの集合、配信され るシグナル、と呼び出されるハンドラに関連付けられたシグナルマスクの和集合 (union) を取ることによって形成されます。 sigaction() システムコールは、sig によって指定されたシグナルのためのアク ションに割り当てられます。act が NULL でないなら、アクション (SIG_DFL, SIG_IGN、またはハンドラルーチン) と指定されたシグナルを配信するとき使用さ れるマスクを指定します。oact が NULL でないなら、シグナルのために以前に扱 われた情報が、ユーザに返されます。 struct sigaction の上記の宣言は、リテラルではありません。それは、アクセス 可能なメンバをリストするためだけに提供されます。実際の定義については、 <sys/signal.h> を参照してください。特に、sa_handler と sa_sigaction に よって占領された記憶域は、オーバラップし、アプリケーションは、同時に両方 を使用することはできません。 いったんシグナルハンドラが設置されると、それは、別の sigaction() システム コールが行われるか、または execve(2) が実行されるまで、通常、設置され続け られます。シグナル特有のデフォルトのアクションは、sa_handler から SIG_DFL まで設定することによってリセットされます。デフォルトは、たぶん、コアダン プで、プロセスの終了、アクションなし、プロセスを停止する、または、プロセ スを継続するです。シグナルのデフォルトのアクションごとに以下のシグナルの リストを参照してください。sa_handler が SIG_DFL であるなら、シグナルのた めのデフォルトのアクションは、シグナルを破棄することであり、シグナルが保 留中であるなら、たとえシグナルがマスクされても、保留中のシグナルは、破棄 されます。sa_handler が SIG_IGN に設定されているなら、シグナルの現在と保 留中のインスタンスは、無視され、破棄されます。 オプションは、sa_flags を設定することによって指定されます。様々なビットの 意味は、次の通りです: SA_NOCLDSTOP SIGCHLD シグナルのための捕獲関数を設置するとき、こ のビットが設定されるなら、SIGCHLD シグナルは、子プ ロセスが停止するときではなく、子プロセスが終了する ときのみ生成されます。 SA_NOCLDWAIT SIGCHLD シグナルのために sigaction() を呼び出すと き、このビットが設定されるなら、システムは、呼び出 しているプロセスの子プロセスが終了するとき、ゾンビ プロセスを作成しません。その後の呼び出しているプロ セスが wait(2) (または同等なもの) を発行するなら、 それは、呼び出しているプロセスの子プロセスののすべ てが終了するまで、ブロックし、次に、errno を ECHILD に設定して、-1 の値で返ります。また、SIGCHLD のため の sa_handler を SIG_IGN に設定することによって、ゾ ンビの作成を回避するのと同じ効果を達成することがで きます。 SA_ONSTACK このビットが設定されているなら、システムは、 sigaltstack(2) がある各スレッドによって指定されるシ グナルスタックのプロセスにシグナルを配信します。 SA_NODEFER このビットが設定されているなら、配信されるシグナル のさらなる発生は、ハンドラの実行の間にマスクされま せん。 SA_RESETHAND このビットが設定されるなら、ハンドラは、シグナルが 配信される瞬間に、元の SIG_DFL にリセットされます。 SA_RESTART 以下の段落を参照してください。 SA_SIGINFO このビットが設定されるなら、ハンドラ関数は、struct sigaction の sa_sigaction メンバによって指されると 仮定され、上記に表示されたプロトタイプまたは下記の 「使用例」のように一致するべきです。このビットは、 SIG_DFL または SIG_IGN を割り当てるとき、設定される べきではありません。 シグナルが以下にリストされたシステムコールの間に捕獲されるなら、呼び出し が、強制的にエラー EINTR で終了されるか、呼び出しが、要求されるより短い データ転送で返るか、または、呼び出しが、再開されます。保留中の呼び出しの 再開は、sa_flags の SA_RESTART ビットを設定することによって要求されます。 影響を受けるシステムコールは、通信チャネルまたは (通常ファイルではなく端 末のような) 遅いデバイスと wait(2) または ioctl(2) の間で open(2), read(2), write(2), sendto(2), recvfrom(2), sendmsg(2) と recvmsg(2) を含 んでいます。しかしながら、既にコミットされた呼び出しは、再開されません が、代りに、部分的な成功 (例えば、短い読み込みカウント) を返します。 pthread_create(3) の後に、シグナルマスクは、新しいスレッドと保留中のシグ ナルのセットによって継承され、新しいスレッドのためのシグナルスタックは、 空です。 fork(2) または vfork(2) の後に、すべてのシグナル、シグナルマスク、シグナ ルスタックと再開/割り込みフラグは、子プロセスによって継承されます。 execve(2) システムコールは、捕獲されたすべてのシグナルのためのデフォルト のアクションを元に戻し、ユーザスタックで捕獲されるすべてのシグナルをリ セットします。無視されたシグナルは、無視され続けます。シグナルマスクは、 同じであり続けます。保留中のシステムコールを再開するシグナルは、そうし続 けます。 次は、インクルードファイル <signal.h> にある名前ですべてのシグナルのリス トです: 名前 デフォルトの動作 説明 SIGHUP プロセスを終了 端末回線のハングアップline hangup SIGINT プロセスを終了 プログラムに割り込む SIGQUIT コアイメージを作成 プログラムを終了 SIGILL コアイメージを作成 不正命令 SIGTRAP コアイメージを作成 トラップをトレースする SIGABRT コアイメージを作成 abort(3) の呼び出し (以前は, SIGIOT) SIGEMT コアイメージを作成 実行されたエミュレート命令 SIGFPE コアイメージを作成 浮動小数点例外 SIGKILL プロセスを終了 プログラムを kill SIGBUS コアイメージを作成 バスエラー SIGSEGV コアイメージを作成 セグメンテーション侵害 SIGSYS コアイメージを作成 呼び出された存在しないシステム コール SIGPIPE プロセスを終了 読み込み側のないパイプに書き込み SIGALRM プロセスを終了 時間切れのリアルタイムタイマ SIGTERM プロセスを終了 ソフトウェア終了シグナル SIGURG シグナルを破棄 ソケット上に存在する緊急状態 SIGSTOP プロセスを停止 停止 (捕捉または無視できない) SIGTSTP プロセスを停止 キーボードから生成されたシグナル を停止 SIGCONT シグナルを破棄 停止後の継続 SIGCHLD シグナルを破棄 子プロセスの状態が変更された SIGTTIN プロセスを停止 制御端末から試みられたバックグラ ウンドの読み込み SIGTTOU プロセスを停止 制御端末に試みられたバックグラウ ンドの書き込み SIGIO シグナルを破棄 I/O が記述子で可能 (fcntl(2) を参 照) SIGXCPU プロセスの終了 超過した CPU 時間の制限 (setrlimit(2) を参照) SIGXFSZ プロセスの終了 超過したファイルサイズの制限 (setrlimit(2) を参照) SIGVTALRM プロセスの終了 仮想時間のアラーム (setitimer(2) を参照) SIGPROF プロセスの終了 プロファイルのタイマのアラーム (setitimer(2) を参照) SIGWINCH シグナルの破棄 ウィンドウサイズの変更 SIGINFO シグナルの破棄 キーボードからの状態要求 SIGUSR1 プロセスの終了 ユーザ定義シグナル 1 SIGUSR2 プロセスの終了 ユーザ定義シグナル 2 注 act で指定された sa_mask フィールドは、SIGKILL または SIGSTOP をブロック することを許可しません。そうする、あらゆる試みは、静かに無視されます。 次の関数は、リエントラントか、またシグナルによって割り込み可能ではなく、 非同期シグナルにセーフです。したがって、アプリケーションは、マルチスレッ ド化されたプロセスで fork(2) を呼び出した後に、シグナル捕獲関数から、また は子プロセスから、制限なしで、それらを呼び出すことができます: 基本インタフェース: _Exit(), _exit(), accept(), access(), alarm(), bind(), cfgetispeed(), cfgetospeed(), cfsetispeed(), cfsetospeed(), chdir(), chmod(), chown(), close(), connect(), creat(), dup(), dup2(), execl(), execle(), execv(), execve(), faccessat(), fchdir(), fchmod(), fchmodat(), fchown(), fchownat(), fcntl(), fork(), fstat(), fstatat(), fsync(), ftruncate(), getegid(), geteuid(), getgid(), getgroups(), getpeername(), getpgrp(), getpid(), getppid(), getsockname(), getsockopt(), getuid(), kill(), link(), linkat(), listen(), lseek(), lstat(), mkdir(), mkdirat(), mkfifo(), mkfifoat(), mknod(), mknodat(), open(), openat(), pause(), pipe(), poll(), pselect(), pthread_sigmask(), raise(), read(), readlink(), readlinkat(), recv(), recvfrom(), recvmsg(), rename(), renameat(), rmdir(), select(), send(), sendmsg(), sendto(), setgid(), setpgid(), setsid(), setsockopt(), setuid(), shutdown(), sigaction(), sigaddset(), sigdelset(), sigemptyset(), sigfillset(), sigismember(), signal(), sigpending(), sigprocmask(), sigsuspend(), sleep(), sockatmark(), socket(), socketpair(), stat(), symlink(), symlinkat(), tcdrain(), tcflow(), tcflush(), tcgetattr(), tcgetpgrp(), tcsendbreak(), tcsetattr(), tcsetpgrp(), time(), times(), umask(), uname(), unlink(), unlinkat(), utime(), wait(), waitpid(), write()。 X/Open システムインタフェース: sigpause(), sigset(), utimes()。 リアルタイムインタフェース: aio_error(), clock_gettime(), timer_getoverrun(), aio_return(), fdatasync(), sigqueue(), timer_gettime(), aio_suspend(), sem_post(), timer_settime()。 POSIX によって非同期シグナルにセーフとして指定されない基本的なインタ フェース: fpathconf(), pathconf(), sysconf()。 POSIX によって非同期シグナルにセーフとして指定されない基本的なインタ フェースですが、予定されています: ffs(), htonl(), htons(), memccpy(), memchr(), memcmp(), memcpy(), memmove(), memset(), ntohl(), ntohs(), stpcpy(), stpncpy(), strcat(), strchr(), strcmp(), strcpy(), strcspn(), strlen(), strncat(), strncmp(), strncpy(), strnlen(), strpbrk(), strrchr(), strspn(), strstr(), strtok_r(), wcpcpy(), wcpncpy(), wcscat(), wcschr(), wcscmp(), wcscpy(), wcscspn(), wcslen(), wcsncat(), wcsncmp(), wcsncpy(), wcsnlen(), wcspbrk(), wcsrchr(), wcsspn(), wcsstr(), wcstok(), wmemchr(), wmemcmp(), wmemcpy(), wmemmove(), wmemset()。 拡張インタフェース: accept4(), bindat(), close_range(), closefrom(), connectat(), eaccess(), ffsl(), ffsll(), flock(), fls(), flsl(), flsll(), futimesat(), pipe2(), strlcat(). strlcpy(), strsep()。 加えて、errno を読み込むか、または書き込むことは、非同期シグナルにセーフ です。 上記にリストされないすべての関数は、シグナルに関して安全 (セーフ) でない と見なされています。すなわち、そのような関数の振る舞いは、それらが安全で ない関数を割り込むシグナルハンドラから呼び出されるとき、未定義です。しか しながら、一般的に、シグナルハンドラは、フラグを設定するだけを行うべきで す。その他のアクションは、安全ではありません。 また、グローバル変数 errno のコピーを作り、シグナルハンドラから返る前に、 それを復旧することはよいことです。これは、シグナルハンドラの内部から呼び 出される関数によって設定されている errno の副作用から保護します。 戻り値 関数 sigaction() は、処理が成功すると値 0 を返します。そうでない場合、値 -1 が返され、グローバル変数 errno にエラーを示す値が設定されます。 使用例 ハンドラが一致する 3 つの指定できるプロトタイプがあります: ANSI C: void handler(int); 伝統的な BSD スタイル: void handler(int, int code, struct sigcontext *scp); POSIX の SA_SIGINFO: void handler(int, siginfo_t *info, ucontext_t *uap); ハンドラ関数は、SA_SIGINFO ビットが sa_flags に設定されているなら、 SA_SIGINFO プロトタイプと一致するべきです。次に、それは、struct sigaction の sa_sigaction メンバによって指されるべきです。利用者は、この方法で SIG_DFL または SIG_IGN を割り当てるべきではないことに注意してください。 SA_SIGINFO フラグが設定されないなら、ハンドラ関数は、ANSI C または伝統的 な BSD プロトタイプのいずれかと一致すべきで、struct sigaction の sa_handler メンバによって指されるべきです。実際には、FreeBSD は、常に後者 の 3 つの引数を送り、ANSI C プロトタイプがサブセットであるので、両方動作 します。FreeBSD インクルードファイルファイルの sa_handler メンバの宣言 は、(POSIX によって必要であるように) ANSI C のそれであるので、BSD スタイ ル関数の関数ポインタは、警告せずにコンパイルするためにキャスト (cast) す る必要があります。伝統的な BSD スタイルは、移植性がなく、そのケーパビリ ティが SA_SIGINFO ハンドラの完全なサブセットであり、その使用は、推奨され ません。 sig 引数は、シグナル番号で、<signal.h> の SIG... 値の 1 つです。 BSD スタイルハンドラの code 引数と SA_SIGINFO ハンドラの info 引数の si_code メンバは、シグナルの原因を説明する数値コードを含み、通常 <sys/signal.h> の SI_... 値の 1 つ、またはシグナルに特有のコード、すなわ ち、SIGFPE のための FPE_... 値の 1 つです。 BSD スタイルのハンドラへの scp 引数は、struct sigcontext のインスタンスを 指します。 POSIX SA_SIGINFO ハンドラへの uap 引数は、ucontext_t のインスタンスを指し ます。 エラー sigaction() システムコールは、次の 1 つが発生するなら、失敗し、新しいシグ ナルハンドラは、インストールされません: [EINVAL] sig 引数が、有効なシグナル番号ではありません。 [EINVAL] SIGKILL または SIGSTOP のためのハンドラを無視するか、 または供給する試みが行われました。 関連項目 kill(1), kill(2), ptrace(2), setitimer(2), setrlimit(2), sigaltstack(2), sigpending(2), sigprocmask(2), sigsuspend(2), wait(2), fpsetmask(3), setjmp(3), siginfo(3), siginterrupt(3), sigsetops(3), ucontext(3), tty(4) 規格 sigaction() システムコールは、ISO/IEC 9945-1:1990 (``POSIX.1'') に適合す るはずです。SA_ONSTACK と SA_RESTART フラグは、シグナル SIGTRAP, SIGEMT, SIGBUS, SIGSYS, SIGURG, SIGIO, SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF, SIGWINCH と SIGINFO と同様に、Berkeley の拡張です。それらのシグナルは、ほ とんどの BSD から派生したシステムで利用可能です。SA_NODEFER と SA_RESETHAND フラグは、他のオペレーティングシステムとの後方互換性のための ものです。SA_NOCLDSTOP と SA_NOCLDWAIT フラグは、他のオペレーティングシス テムに共通にある特徴的なオプションです。フラグは、SIGCHLD を無視すること によってゾンビの生成を回避するオプションともに、Version 2 of the Single UNIX Specification (``SUSv2'') によって承認されています。 FreeBSD 13.2 June 29, 2020 FreeBSD 13.2