HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
HP C RTL では,OpenVMS 例外を使用して setjmp関数と longjmp関数を実装しています。 longjmp関数を呼び出すと, C$_LONGJMP OpenVMS 例外が通知されます。 C$_LONGJMP 例外がユーザ例外ハンドラによって妨害されるのを防止するには, LIB$ESTABLISHを呼び出す代わりに, VAXC$ESTABLISHルーチンを使用してユーザ OpenVMS 例外ハンドラを設定します。 C$_LONGJMP ニーモニックは <errnodef.h>ヘッダ・ファイルに定義されています。
C プログラムで OpenVMS 例外ハンドラと UNIX シグナルを使用する場合は,表 4-4 (VAX only) および表 4-5 (Alpha only) に示した OpenVMS 例外を受け付けて再通知するように, OpenVMS 例外ハンドラを準備する必要があり,さらに HP C RTL の将来のバージョンで導入される可能性のある C$ 機能例外や C$_LONGJMP 例外も受け付けるようにしなければなりません。これは,UNIX シグナルがコンテキストでグローバルであるのに対し, OpenVMS 例外がスタック・フレーム・ベースだからです。
したがって,OpenVMS 例外ハンドラは, main ルーチンの HP C RTL 例外ハンドラより前に, UNIX シグナルに対応する例外を常に受け取ります。 OpenVMS 例外を再通知することにより, HP C RTL 例外ハンドラは例外を受け取ることができます。 OpenVMS 例外をインターセプトすることも可能ですが,その場合は,対応する UNIX シグナルを禁止します。
| 名前 | OpenVMS 例外 | シグナルを生成するイベント | コード |
|---|---|---|---|
| SIGABRT | SS$_OPCCUS | abort 関数 | -- |
| SIGALRM | SS$_ASTFLT | alarm 関数 | -- |
| SIGBUS | SS$_ACCVIO | アクセス違反 | -- |
| SIGBUS | SS$_CMODUSER | 変更モード・ユーザ | -- |
| SIGCHLD | C$_SIGCHLD | 子プロセスの停止 | -- |
| SIGEMT | SS$_COMPAT | 互換性モード・トラップ | -- |
| SIGFPE | SS$_DECDIV | 10 進数除算トラップ | FPE_DECDIV_TRAP |
| SIGFPE | SS$_DECINV | 10 進数不正オペランド・トラップ | FPE_DECINV_TRAP |
| SIGFPE | SS$_DECOVF | 10 進オーバフロー・トラップ | FPE_DECOVF_TRAP |
| SIGFPE | SS$_HPARITH | 0 による浮動小数点/ 10 進数除算 | FPE_FLTDIV_TRAP |
| SIGFPE | SS$_HPARITH | 浮動小数点オーバフロー・トラップ | FPE_FLTOVF_TRAP |
| SIGFPE | SS$_HPARITH | 浮動小数点アンダフロー・トラップ | FPE_FLTUND_TRAP |
| SIGFPE | SS$_HPARITH | 整数オーバフロー | FPE_INTOVF_TRAP |
| SIGFPE | SS$_HPARITH | 不正なオペランド | FPE_INVOPR_TRAP |
| SIGFPE | SS$_HPARITH | 不正確な結果 | FPE_INXRES_TRAP |
| SIGFPE | SS$_INTDIV | 0 による整数除算 | FPE_INTDIV_TRAP |
| SIGFPE | SS$_SUBRNG | 範囲外の添字 | FPE_SUBRNG_TRAP |
| SIGFPE | SS$_SUBRNG1 | 範囲外の添字 1 | FPE_SUBRNG1_TRAP |
| SIGFPE | SS$_SUBRNG2 | 範囲外の添字 2 | FPE_SUBRNG2_TRAP |
| SIGFPE | SS$_SUBRNG3 | 範囲外の添字 3 | FPE_SUBRNG3_TRAP |
| SIGFPE | SS$_SUBRNG4 | 範囲外の添字 4 | FPE_SUBRNG4_TRAP |
| SIGFPE | SS$_SUBRNG5 | 範囲外の添字 5 | FPE_SUBRNG5_TRAP |
| SIGFPE | SS$_SUBRNG6 | 範囲外の添字 6 | FPE_SUBRNG6_TRAP |
| SIGFPE | SS$_SUBRNG7 | 範囲外の添字 7 | FPE_SUBRNG7_TRAP |
| SIGHUP | SS$_HANGUP | データ・セット・ハングアップ | -- |
| SIGILL | SS$_OPCDEC | 予約命令 | ILL_PRIVIN_FAULT |
| SIGILL | SS$_ROPRAND | 予約オペランド | ILL_RESOP_FAULT |
| SIGINT | SS$_CONTROLC | OpenVMS Ctrl/C 割り込み | -- |
| SIGIOT | SS$_OPCCUS | カスタマ予約 op コード | -- |
| SIGKILL | SS$_ABORT | 外部シグナルのみ | -- |
| SIGQUIT | SS$_CONTROLY | raise 関数 | -- |
| SIGPIPE | SS$_NOMBX | メールボックスなし | -- |
| SIGPIPE | C$_SIGPIPE | 壊れたパイプ | -- |
| SIGSEGV | SS$_ACCVIO | 長さ違反 | -- |
| SIGSEGV | SS$_CMODSUPR | 変更モード・スーパバイザ | -- |
| SIGSYS | SS$_BADPARAM | システム呼び出しに対する不正な引数 | -- |
| SIGTERM | 実装されていない | -- | -- |
| SIGTRAP | SS$_BREAK | ブレークポイント・フォルト・インストラクション | -- |
| SIGUSR1 | C$_SIGUSR1 | raise 関数 | -- |
| SIGUSR2 | C$_SIGUSR2 | raise 関数 | -- |
| SIGWINCH 1 | C$_SIGWINCH 2 | raise 関数 | -- |
|
| 名前 | OpenVMS 例外 | シグナルを生成するイベント | コード |
|---|---|---|---|
| SIGABRT | SS$_OPCCUS | abort 関数 | -- |
| SIGALRM | SS$_ASTFLT | alarm 関数 | -- |
| SIGBUS | SS$_ACCVIO | アクセス違反 | -- |
| SIGBUS | SS$_CMODUSER | 変更モード・ユーザ | -- |
| SIGCHLD | C$_SIGCHLD | 子プロセスの停止 | -- |
| SIGEMT | SS$_COMPAT | 互換性モード・トラップ | -- |
| SIGFPE | SS$_DECOVF | 10 進オーバフロー・トラップ | FPE_DECOVF_TRAP |
| SIGFPE | SS$_DECDIV | 10 進数除算トラップ | FPE_DECDIV_TRAP |
| SIGFPE | SS$_DECINV | 10 進数不正オペランド・トラップ | FPE_DECINV_TRAP |
| SIGFPE | SS$_FLTDENORMAL | デノーマル・オペランド・フォルト | FPE_FLTDENORMAL_FAULT |
| SIGFPE | SS$_FLTDIV | 0 による浮動小数点/10 進数除算 | FPE_FLTDIV_TRAP |
| SIGFPE | SS$_FLTDIV_F | 0 による浮動小数点除算フォルト | FPE_FLTDIV_FAULT |
| SIGFPE | SS$_FLTINE | 不正確操作トラップ | FPE_FLTINE_TRAP |
| SIGFPE | SS$_FLTINV | 不正操作トラップ | FPE_FLTINV_TRAP |
| SIGFPE | SS$_FLTINV_F | 不正操作フォルト | FPE_FLTINV_FAULT |
| SIGFPE | SS$_FLTOVF | 浮動小数点オーバフロー・トラップ | FPE_FLTOVF_TRAP |
| SIGFPE | SS$_FLTUND | 浮動小数点アンダフロー・トラップ | FPE_FLTUND_TRAP |
| SIGFPE | SS$_INTDIV | 0 による整数除算 | FPE_INTDIV_TRAP |
| SIGFPE | SS$_INTOVF | 整数オーバフロー | FPE_INTOVF_TRAP |
| SIGFPE | SS$_SUBRNG | 添字の範囲 | FPE_SUBRNG_TRAP |
| SIGHUP | SS$_HANGUP | データ・セット・ハングアップ | -- |
| SIGILL | SS$_OPCDEC | 予約命令 | ILL_PRIVIN_FAULT |
| SIGILL | SS$_ROPRAND | 予約オペランド | ILL_RESOP_FAULT |
| SIGINT | SS$_CONTROLC | OpenVMS Ctrl/C 割り込み | -- |
| SIGIOT | SS$_OPCCUS | カスタマ予約 op コード | -- |
| SIGKILL | SS$_ABORT | 外部シグナルのみ | -- |
| SIGQUIT | SS$_CONTROLY | raise 関数 | -- |
| SIGPIPE | SS$_NOMBX | メールボックスなし | -- |
| SIGPIPE | C$_SIGPIPE | 壊れたパイプ | -- |
| SIGSEGV | SS$_ACCVIO | 長さ違反 | -- |
| SIGSEGV | SS$_CMODSUPR | 変更モード・スーパバイザ | -- |
| SIGSYS | SS$_BADPARAM | システム呼び出しに対する不正な引数 | -- |
| SIGTERM | 実装されていない | -- | -- |
| SIGTRAP | SS$_TBIT | TBIT トレース・トラップ | -- |
| SIGTRAP | SS$_BREAK | ブレークポイント・フォルト命令 | -- |
| SIGUSR1 | C$_SIGUSR1 | raise 関数 | -- |
| SIGUSR2 | C$_SIGUSR2 | raise 関数 | -- |
| SIGWINCH | C$_SIGWINCH | raise 関数 | -- |
例 4-1 は, signal, alarm, pause関数の動作方法を示しています。また,プログラムの終了を防止するために,シグナルを検出するようにシグナル・ハンドラを設定する方法も示しています。
| 例 4-1 プログラムの一時停止と再開 |
|---|
/* CHAP_4_SUSPEND_RESUME.C */
/* This program shows how to alternately suspend and resume a */
/* program using the signal, alarm, and pause functions. */
#define SECONDS 5
#include <stdio.h>
#include <signal.h>
int number_of_alarms = 5; /* Set alarm counter. */
void alarm_action(int);
main()
{
signal(SIGALRM, alarm_action); /* Establish a signal handler. */
/* to catch the SIGALRM signal.*/
alarm(SECONDS); /* Set alarm clock for 5 seconds. */
pause(); /* Suspend the process until *
* the signal is received. */
}
void alarm_action(int x)
{
printf("\t<%d\007>", number_of_alarms); /* Print the value of */
/* the alarm counter. */
signal(SIGALRM, alarm_action); /* Reset the signal. */
alarm(SECONDS); /* Set the alarm clock. */
if (--number_of_alarms) /* Decrement alarm counter. */
pause();
}
|
例 4-1 から次の出力が生成されます。
$ RUN EXAMPLE
<5> <4> <3> <2> <1>
|
| 前へ | 次へ | 目次 | 索引 |