標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.1 |
両方 | 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 プログラムだけです。
値 | デフォルト・アクション | 意味 |
---|---|---|
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 | 続行 (停止した場合) |
オペレーティング・システムまたはアプリケーションで検出もしくは処理できない方法でメインプログラムが異常終了すると、z/OSUNIX は、実行中のアプリケーションを KILL -9 で終了します。z/OSUNIX が EOT または EOM の制御を取得し、さらに終了状況が設定されていない場合、z/OSUNIX は、KILL -9 が発生した場合と同じ終了状況を設定します。
プログラム・チェックもしくは ABEND の結果、シグナル SIGABND、SIGFPE、 SIGILL、または SIGSEGV のシグナル・キャッチャーが起動して、そのシグナル・キャッチャーが RETURN ステートメントを実行すると、プロセスは終了します。
struct sigaction {
void (*sa_handler)(int);
sigset_t sa_mask;
int sa_flags;
void (*sa_sigaction)(int, siginfo_t *, void *);
};
XPG4.2 の特殊な動作: この メンバーおよび sa_sigaction は、相互に排他的です。SA_SIGINFO フラグが sa_flags に設定 されるときは、sa_sigaction が使用されます。そうで ない場合には、sa_handler が使用されます。
sa_mask は、sigemptyset()、sigfillset()、sigaddset()、および sigdelset() といったシグナル・セット操作関数 (1 つ以上) を使って設定する必要があります。
さらに、このフラグが設定されると、sigaction() は、あたかも SA_NODEFER フラグも設定されたかのように作動します。
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() |
void function(int signo);
ここでは、signo はシグナル・ハンドラーの唯一の引数 で、これにより、シグナル・ハンドラー関数を起動させたシグナル のタイプが指定されます。void function(int signo, siginfo_t *info, void *context);
ここでは、追加の 2 つの引数がシグナル・ハンドラー関数に 渡されます。2 番目の引数は NULL ポインターではない場合には、シグナルのソースに関する追加情報を提供する タイプ siginfo_t のオブジェクトを示します。siginfo_t オブジェクトは、以下のメンバーを含む構造体です。si_signo に SIGPOLL が含まれていると、si_code を SI_ASYNCIO に設定することができます。その他の場合、si_code の値がゼロ以下であるときには、シグナルは別のプロセスによって生成されており、si_pid および si_uid メンバーにはそれぞれ、このシグナルの送信側のプロセス ID および実ユーザー ID が示されます。
si_code の値がゼロより小さいか等しい場合には、シグナルは別のプロセス によって生成されており、si_pid および si_uid メンバーではそれぞれ、このシグナルの送信側のプロセス ID および 実ユーザー ID が示されます。
_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() によって保留中の シグナルを廃棄する機能が提供されます。
void function(int signo, siginfo_t *info, void *context);
ここでは、function は指定されたシグナル・キャッチング関数であり、signo は送達中のシグナルのシグナル番号です。info は、送達中のシグナルと関連した 型 siginfo_t のオブジェクトを指します。context は、型 ucontext_t の オブジェクトを指します。非同期シグナル・キャッチング関数の考慮事項:一部の関数は、非同期シグナルに関しては、逐次再使用が可能に なるように制限されています。つまり、ライブラリーでは、非同期シグナルによりこれらの 関数の 1 つの実行が、完了前に割り込まれることは許可されて いません。
シグナル・キャッチング関数が非同期に起動される際には、この制限を考慮する必要があります。これが原因で、一部の ライブラリー関数の動作が予測不可能になるからです。
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() |
getc() および putc() のマクロ・バージョンは、たとえ これらの関数のライブラリー・バージョンが再入可能でも、再入不可能です。
この関数では、SIGTHSTOP および SIGTHCONT シグナルの使用はサポートされていません。
正常に実行された場合、sigaction() は 0 を戻します。
SIGCHILD および SIGIO のデフォルト・アクションは、無視されるシグナルのためのものです。SIGIO の SIG_IGN にアクションを設定する sigaction() は、エラー (errno が EINVAL に設定される) になります。
⁄* 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
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"); }