# OpenVMS
ユーザーズ・マニュアル

前へ | 次へ | 目次 | 索引

## 15.11.2 特権イメージの中断

特権イメージの実行を中断した場合，このイメージのコンテキストをセーブしたければ，CONTINUE，SPAWN，ATTACH のいずれかのコマンドを入力します。他のコマンドを入力すると (ユーザが生成または接続したサブプロセスの中から入力する場合を除く)，特権イメージは強制的に終了されます。

# 15.12 Ctrl/Y アクション・ルーチンの設定

これ以降の節では，Ctrl/Y アクション・ルーチンの設定方法を説明します。

## 15.12.1 ON コマンドの使用

エラー状態のときのアクションを定義する ON コマンドによって，コマンド・プロシージャの実行中に生じた Ctrl/Y による中断のアクション・ルーチンを定義する方法を指定することもできます。ユーザが指定するアクションは，省略時の Ctrl/Y アクション (Ctrl/Y コマンド・レベルでコマンド入力を求めるプロンプトを出す) を無効にします。

    $ ON CONTROL_Y THEN EXIT

プロシージャがこの ON コマンドを実行した場合，この後のプロシージャの実行中に Ctrl/Y による中断が生じると，プロシージャは終了します。このとき，前のコマンド・レベルに制御が渡されます。

Ctrl/Y を押してON CONTROL_Y を使用するプロシージャを中断した場合は，次のアクションを実行します。

- 現在実行中のコマンドがコマンド・インタプリタの中で実行されるコマンドの場合には，コマンドを完了してから Ctrl/Y アクションが実行される。

- 現在のコマンドまたはプログラムがコマンド・インタプリタ以外のイメージによって実行される場合には，イメージが強制終了されてから Ctrl/Y アクションが実行される。ただし，イメージが終了ハンドラを宣言している場合には，終了ハンドラを実行してから Ctrl/Y アクションが実行される。 Ctrl/Y アクションの後はイメージ処理は継続できない。

## 15.12.2 Ctrl/Yの入力結果

Ctrl/Y アクションを実行しても，省略時の Ctrl/Y アクションには自動的に戻りません。 Ctrl/Y アクションは，次のいずれかの条件が生じるまで有効です。

- プロシージャが終了する (Ctrl/Y を押す，EXIT または STOP コマンドを実行する，または省略時のエラー状態処理アクションの結果として) 。

- 別の ON CONTROL_Y コマンドを実行する。

- プロシージャが SET NOCONTROL=Y コマンドを実行する ( 第 15.13 節 を参照)。

Ctrl/Y アクションは各アクティブ・コマンド・レベル内で指定でき，指定されたコマンド・レベルに対してのみ影響します。

次の例に見られるように，このプロシージャが実行されると， Ctrl/Y 割り込みが生じるたびにSHOW TIME コマンドが実行されます。 SHOW TIME コマンドの実行後，プロシージャは，中断されたコマンドの後のコマンドから実行を再開します。

    $ ON CONTROL_Y THEN SHOW TIME

次の図は，Ctrl/Y による中断後の実行フローを示しています。

図 15-2 Ctrl/Y アクション後の実行フロー

1. TYPE コマンドの実行中に Ctrl/Y による割り込みが発生。

2. ラベル CLEAN_UP に制御が移る。

3. ルーチンの実行完了後にコマンド・プロシージャは終了し，会話コマンド・レベルに戻る。

4. TYPE コマンドの実行中に Ctrl/Y による割り込みが発生。

5. ON コマンドで指定されている WRITE コマンドが実行される。

6. 中断されたコマンドの次のコマンドからコマンド・プロシージャが再開される。

次の図は，ネストされたコマンド・プロシージャの実行中に Ctrl/Y を押すとどうなるかを示しています。

図 15-3 ネストされたコマンド・プロシージャ実行中のCtrl/Y

1. SEARCH.COM の実行中に Ctrl/Y による割り込みが生じると， CLEAN_UP ラベルに制御が渡される。

2. SUBSEARCH.COM の実行中に Ctrl/Y による割り込みが生じると， SEARCH.COM の中の NEXT_STEP ラベルに制御が渡される。

3. SUBSEARCH.COM では Ctrl/Y アクションが指定されていないため， Ctrl/Y 割り込みが生じると，プロシージャは終了して前のコマンド・レベルに戻る。

4. SUBSUB.COM の実行中に Ctrl/Y による割り込みが生じると， SHOW TIME が実行される。

# 15.13 Ctrl/Y による割り込みの無効化/有効化

これ以降の節では， Ctrl/Y による割り込むを有効にする方法，および無効にする方法を説明します。

## 15.13.1 SET NOCONTROL=Y の使用

SET NOCONTROL=Y コマンドは，Ctrl/Y による割り込みを無効にします。すなわち，コマンド・プロシージャが SET NOCONTROL=Y コマンドを実行した場合は， Ctrl/Y を押しても割り込みは生じません。

SET NOCONTROL=Y コマンドは，ON CONTROL_Y コマンドによって設定された現在の Ctrl/Y アクションも取り消します。省略時の Ctrl/Y アクションに戻すには，次の 2 つのコマンドを使用します。

    $ SET NOCONTROL=Y
    $ SET CONTROL=Y

SET NOCONTROL=Y コマンドは，Ctrl/Y の処理を無効にし，現在の ON CONTROL_Y の処理を取り消します。 SET CONTROL=Y コマンドは Ctrl/Y の処理を有効にします。この時点で，省略時の処理が再度有効になります。つまり，プロシージャの実行中に Ctrl/Y が押された場合には，コマンド・インタプリタは，Ctrl/Y コマンド・レベルでコマンドを要求するプロンプトを表示します。

SET NOCONTROL=Y コマンドはどのコマンド・レベルでも使用できます。 SET CONROL=Y コマンドによって Ctrl/Y による割り込みを使用可能にするまで，すべてのコマンド・レベルで Ctrl/Y は無効です。

## 15.13.2 SET CONTROL=Y コマンドの使用

ON CONTROL_Y コマンドは，別の ON CONTROL_Y または SET NOCONTROL=Y コマンドが実行されるか，コマンド・プロシージャが終了するまで有効です。

Ctrl/Y が無効に設定されているときに，無限に終了しないループを終了するには， DCL コマンド STOP を使用して，別のターミナルからプロセスを削除しなければなりません。省略時の Ctrl/Y の処理を無効に設定した場合には，できるだけただちにリセットしてください。省略時の Ctrl/Y の処理をリセットするには， SET NOCONTROL=Y コマンドの後に SET CONTROL=Y コマンドを実行します。

このコマンド・プロシージャでは，ファイルの内容を表示しているときに Ctrl/Y を押すと，制御はラベル END_TYPE に渡されます。

       .
       .
       .
    $! Type a file
    $ IF COMMAND .NES. "TY" THEN GOTO END_TYPE
    $ ON CONTROL_Y THEN GOTO END_TYPE
    $ TYPE 'FILESPEC'
    $END_TYPE:
    $!
    $! Reset default
    $ SET NOCONTROL=Y
    $ SET CONTROL=Y
       .
       .
       .

注意 ON CONTROL_Y コマンドと SET NOCONTROL=Y コマンドは特別な用途で使用します。一般に，Ctrl/Y による割り込みを無効にすることはおすすめしません。 Ctrl/Y が無効なときに非終了ループを終了するには，ループ・プロシージャを実行しているプロセスを別のターミナルから削除しなければなりません。

# 15.14 条件コードを使用しているコマンド・プロシージャでのエラーの検出

コマンド・プロシージャの中のそれぞれの DCL コマンドの実行が終了すると，コマンド・インタプリタは，コマンドの終了理由を説明する条件コードをセーブします。このコードを見ると，処理が完了したのか，情報またはエラー・メッセージが出されたのかがわかります。

コマンド・インタプリタは，コマンド・プロシージャの中のそれぞれのコマンドを実行し終わると，条件コードを調べます。特別なアクションが必要なエラーが生じた場合は，システムはそのアクションを実行します。それ以外の場合には，プロシージャの中の次のコマンドが実行されます。

## 15.14.1 条件コードの表示 ($STATUS)

コマンド・インタプリタは，条件コードを 32 ビットのロングワードとして予約グローバル・シンボル $STATUS にセーブします。 $STATUS は，次のようなシステム・メッセージ・コードの形式に従います。

- ビット 0 〜 2 には，メッセージの重大度が指定される。

- ビット 3 〜 15 には，メッセージ番号が指定される。

- ビット 16 〜 27 には，メッセージを生成する機能に関連する番号が指定される。

- ビット 28 〜 31 には，内部制御フラグが指定される。

コマンドの実行が完了した場合，$STATUS は奇数値になります (ビット 0 〜 2 には 1 または 3 が指定されます)。何らかの警告またはエラーが生じた場合は，$STATUS は偶数値になります (ビット 0 〜 2 に 0，2，または 4 が指定されます)。コマンド・インタプリタは，$STATUS の現在の 16 進値を保持して表示します。 SHOW SYMBOL $STATUS コマンドを入力すると， $STATUS の ASCII 変換値が表示されます。

次の例では，ファイル名が誤って入力されています。

    $ CREATE %FILE.LIS
    %CREATE-E-OPENOUT, error opening %FRED.LIS; as output
    -RMS-F-WLD, invalid wildcard operation
    $ SHOW SYMBOL $STATUS
      $STATUS = " %X109110A2"
    $ WRITE SYS$OUTPUT F$MESSAGE(%X109110A2)
      %CREATE-E-OPENOUT, error opening !AS as output

## 15.14.2 EXIT コマンドを含む条件コード

コマンド・プロシージャが終了すると，コマンド・インタプリタは前のコマンドの条件コードを $STATUS に戻します。条件コードは，最後に実行されたコマンドが正常終了したかどうかに関する情報を提供します。

コマンド・プロシージャで EXIT コマンドを使用する場合には， DCL が $STATUS に割り当てる値を変更する値を指定できます。この値は状態コードと呼び，整数式として指定しなければなりません。

コマンド・プロシージャに，ネスティングしたコマンド・プロシージャが含まれており，複数のコマンド・レベルを作成する場合には，EXIT コマンドを使用して，省略時の条件コードを明示的に無効にする値を戻すことができます。

次の 2 つのコマンド・プロシージャについて調べてみましょう。

    $! This is file A.COM
    $!
    $ @B
       .
       .
       .

    $! This is file B.COM
    $!
    $ ON WARNING THEN GOTO ERROR
       .
       .
       .
    $ ERROR:
    $ EXIT 1

B.COM の ON コマンドは，B.COM の実行中に警告，エラー，重大なエラーのいずれかが発生した場合には，プロシージャの制御がラベル ERROR に渡されることを示しています。ここでは，条件コードは明示的に 1 に設定されており，正常終了を示します。したがって，B.COM が終了すると，エラーが発生したかどうかとは無関係に，正常終了コードが A.COM に戻されます。

## 15.14.3 重大度レベルの決定

$STATUS の下位 3 ビットは，コマンドが終了する原因となった条件の重大度を示します。条件コードのこの部分は，予約されているグローバル・シンボル $SEVERITY に格納されます。 $SEVERITY シンボルの値は 0〜4 の範囲であり，各値はそれぞれ次の重大度レベルを表現します。

値 | 重大度
--- | ---
0 | 警告
1 | 正常終了
2 | エラー
3 | 情報
4 | 致命的な (重大な) エラー

正常終了コードと情報コードは奇数の数値であり，警告コードとエラー・コードは偶数の数値です。

## 15.14.4 正常終了のテスト

次に示すように，$SEVERITY または $STATUS に対して論理テストを実行する IF コマンドを使用すれば，コマンドの正常終了をテストできます。

    $ IF $SEVERITY THEN GOTO OKAY
    $ IF $STATUS THEN GOTO OKAY

これらの IF コマンドは，$SEVERITY および $STATUS の値が真 (奇数) の場合には，ラベル OKAY に分岐します。 $SEVERITY と $STATUS の現在の値が奇数の場合には，コマンドまたはプログラムは正常終了しています。コマンドまたはプログラムが正常終了しなかった場合には， $SEVERITY と $STATUS の値は偶数です。したがって，IF 式は偽になります。

条件が真であるかどうかをテストするかわりに，偽であるかどうかをテストすることもできます。次の例を参照してください。

    $ IF .NOT. $STATUS THEN ...

コマンド・インタプリタは条件コードの重大度レベルを使用して， ON コマンドによって定義される処理を実行するかどうかを判断します。 第 15.9 節 の説明を参照してください。

# 15.15 $STATUS を設定しないコマンドの使用

大部分の DCL コマンドは，正常終了したときに状態値とエラー・メッセージを生成するシステム・ユーティリティを起動します。しかし，正常終了したときに，$STATUSと $SEVERITY の値を変更しないコマンドがいくつかあります。これらのコマンドは次のとおりです。

CONTINUE | DECK | DEPOSIT
EOD | EXAMINE | GOTO
IF | RECALL | SET SYMBOL/SCOPE
SHOW STATUS | SHOW SYMBOL | STOP
WAIT |  |

これらのコマンドを正しく実行できなかった場合には，条件コードは $STATUS に格納され，重大度レベルは $SEVERITY に格納されます。

# 15.16 ログイン・コマンド・プロシージャ

ログイン・コマンド・プロシージャとは，ユーザがログインするたびに，オペレーティング・システムが自動的に実行するコマンド・プロシージャです。また，ユーザがキューに登録した各バッチ・ジョブの先頭で，システムはこのプロシージャを実行します。

ログイン・コマンド・プロシージャには，次の 2 種類があります。

- システム全体で有効な (またはグループで定義された) プロシージャ

- 個人用プロシージャ

## 15.16.1 システム全体のログイン・コマンド・プロシージャ

システム全体で有効なログイン・コマンド・プロシージャには，次の特徴があります。

- 個人用ログイン・コマンド・プロシージャより前に実行される。

- システム全体で有効なログイン・コマンド・プロシージャが終了すると，制御は個人用ログイン・コマンド・プロシージャに渡される。

- このようなコマンド・プロシージャを使用すると，システム管理者は，ユーザがログインするときに特定のコマンドを必ず実行するように設定できる。

システムまたはグループ・ログイン・コマンド・プロシージャを設定する場合，システム管理者は，論理名 SYS$SYLOGIN を該当するログイン・コマンド・プロシージャに定義します。このログイン・コマンド・プロシージャは，すべてのシステム・ユーザに対して適用するように指定することも，特定のユーザ・グループに対してのみ適用されるように指定することもできます。

## 15.16.2 パーソナル・ログイン・コマンド・プロシージャ

ユーザは，ログインするたびに同じコマンドを実行するパーソナル・ログイン・コマンド・プロシージャを作成できます。

ログイン・コマンド・プロシージャのファイル指定は，システム管理者が割り当てます。ほとんどの場合，ログイン・コマンド・プロシージャは LOGIN.COM という名前にします。システム管理者が特に指定しない限り，ログイン・コマンド・プロシージャをLOGIN.COM という名前にします。

注釈の付いた完成した LOGIN.COM プロシージャについては， 付録 C を参照してください。

## 15.16.3 専用アカウントのログイン・コマンド・プロシージャ

システム管理者は，特別なコマンド・プロシージャの名前をアカウントの LGICMD フィールドに置くことによって， 専用のアカウント を設定できます。専用のアカウントにログインした場合に実行できるのは，コマンド・プロシージャでそのアカウントに指定された機能だけで，完全な DCL コマンド・セットは実行できません。専用アカウントについての詳細は，『Compaq OpenVMS システム管理者マニュアル』を参照してください。

前へ | 次へ | 目次 | 索引