COBOL はさまざまなデバイスを明示的または暗黙のうちに認識します。この章では、各種デバイスの COBOL に属する側面とオペレーティングシステムに依存する側面を取り上げ、これらのデバイスを使用できるように構成し、COBOL からアクセスする方法を説明します。
COBOL 言語はさまざまな種類の論理デバイスを認識し、ランタイムシステムによって該当する物理デバイスに自動的にマッピングします。ファイルの場合は、ランタイムシステムやオペレーティングシステムがデバイスとして認識するファイルの名前を明示的に指定することによって、この自動マッピングをオーバーライドすることが可能です。ただし、ファイル名はオペレーティングシステムに依存するため、この方法は、移植性を重視するプログラムで使用すべきではありません。
COBOL 言語で自動的に認識される論理デバイスは、次の 4 つのカテゴリに分類されます。
COBOL のファイルは通常、オペレーティングシステムがサポートするファイルシステムにマッピングされますが、物理プリンタやプリントスプーラ、名前付きパイプ、論理デバイス、デバイスドライバなど、他のデバイスや関数にマッピングすることも可能です。ランタイムシステムが特定のファイル名を区別して認識したり、オペレーティングシステムからファイルの種類を取り込んだ結果、一部のファイルが特殊な論理デバイスや物理デバイスに関連付けられる可能性もあります。
COBOL では、書式設定のないシンプルな ACCEPT 文に標準入力デバイス、書式設定のない単純な DISPLAY 文と STOP リテラル 文に標準出力デバイスをそれぞれ使用することが前提になります。これらの標準論理デバイスはコンソールに直接マッピングできるほか、オペレーティングシステムの標準入出力デバイスを介して間接的にマッピングすることも可能です。
COBOL の ACCEPT 文と DISPLAY 文は、スクロールなしの全画面フォームにも対応しており、これは COBOL ランタイムシステムによって物理端末デバイスや論理端末デバイスにマッピングされます。
COBOL では、ソースプログラムの構成部 (CONFIGURATION SECTION) で機能名 (function-name) を宣言することによって、論理デバイスに依存する機能を指定できます (『言語リファレンス』の『特殊名段落』を参照)。これらの機能は、オペレーティングシステムの該当する機能にマッピングされます。
COBOL のファイルは通常、オペレーティングシステムがサポートするファイルシステムにマッピングされるため、COBOL システムは固定メディアやリムーバブルメディアのデバイスを検出できません (『ファイル操作』を参照)。
COBOL ファイルのマッピング先は、次の 3 つの方法で変更することが可能です。
いずれの場合も、COBOL ファイルは標準ファイルシステム上のファイル以外にマッピングされるため、COBOL プログラムも特殊なデバイスの使用に伴う制約に従う必要があります。たとえば、プリンタを入力に使用したり、磁気テープデバイスを索引ファイルやランダムアクセスファイルとして使用したりすることはできず、名前付きパイプによるレコードロック構文の使用も禁止されます。
次の表 15-1 は、UNIX 版の COBOL ランタイムシステムで認識される特殊デバイス名を示しています。
Server Express のランタイムシステムは、大文字と小文字を区別してデバイス名を認識します。
COBOL システムで特殊デバイス名として認識される文字列は、ファイルシステム上のファイルにアクセスする際のファイル名として使用すべきではありません。
デバイス名 | 対象となるオペレーティングシステムのデバイス |
:CI:
stdin |
標準入力ストリーム |
:CO:
stdout |
標準出力ストリーム |
:CE:
stderr |
標準エラーストリーム (利用できない場合は標準出力ストリーム) |
表 15-1 COBOL の特殊デバイス名
表 15-2 は、オペレーティングシステムで認識される最も一般的な特殊デバイス名を示しています。ここで紹介していない特殊デバイスについては、使用しているオペレーティングシステムのマニュアルを参照してください。
ファイル名 | オペレーティングシステムの該当デバイス |
---|---|
/dev/null | 出力を無視するデバイス |
/dev/floppy | フロッピーディスクドライブ |
/dev/cart0 | カートリッジテープドライブ |
表 15-2 オペレーティングシステムの特殊デバイス名
UNIX オペレーティングシステムでは、名前付きパイプなどの特殊なファイルに、任意のファイル名を付けることができます。
フロッピーディスクドライブやテープカートリッジドライブなどのデバイスに使用されるファイル名は、 UNIX のバージョンごとに異なり、同じバージョンでもインストール環境によって異なる場合があります。そのため、上記の特殊デバイス名は例にすぎません。
プログラムの移植性を重視する場合は、ファイルシステム上のファイルにアクセスする際のファイル名として、他のオペレーティングシステムで特殊デバイス名として認識される文字列を使用すべきではありません。
FILE-CONTROL 段落では、いくつかの特殊デバイス句を使用して、各種デバイスのファイル名とその他のファイル関連情報を指定できます。ファイル関連の一部の情報はデバイスに依存します。FILE-CONTROL 段落で使用できる特殊デバイス名を 表 15-3 に示します。
ファイル名
|
オペレーティングシステムの該当ファイル
|
---|---|
LINE ADVANCING | プリンタ出力ファイル |
MULTIPLE REEL | 複数のメディア単位におよぶ可能性があるファイル |
MULTIPLE UNIT | 複数のメディア単位におよぶ可能性があるファイル |
DISK | 覚え書き |
KEYBOARD | 行順ファイル (デフォルトのファイル名は :CI:) |
DISPLAY | 行順ファイル (デフォルトのファイル名は :CO:) |
PRINTER | プリンタ出力ファイル (デフォルトのファイル名は LPT1) |
PRINTER-1 | プリンタ出力ファイル (デフォルトのファイル名は LPT2) |
表 15-3 COBOL の特殊デバイス句
LINE ADVANCING は、オペレーティングシステムに依存しない標準形式でプリンタ出力されるファイルを指定します (標準のプリンタ出力形式の詳細については、『ファイル操作』の『ファイル構造』の章を参照)。このファイルに対する WRITE 文は、BEFORE 指定と AFTER 指定のどちらも指定されていなければ、AFTER 1 指定が指定されている場合と同様の処理を行います。詳細については、『言語リファレンス』の『WRITE 文』を参照してください。
MULTIPLE REEL と MULTIPLE UNIT は、いずれも対象デバイスの 1 つのメディア単位に収まらない可能性があるファイルを指定します。メディア単位とは、たとえばフロッピーディスクやテープカートリッジです。詳細については、『ファイル操作』を参照してください。
DISK は覚え書きであり、まったく効力を持ちません。
KEYBOARD は、標準入力デバイスを行順編成のレコードを持つファイルとして扱うように指定します。ファイル名を指定しない場合は、デフォルトの :CI: (標準入力デバイス) が使用されます。
DISPLAY は、標準出力デバイスを行順編成のレコードを持つファイルとして扱うように指定します。ファイル名を指定しない場合は、デフォルトの :CO: (標準出力デバイス) が使用されます。
PRINTER と PRINTER-1 は、いずれも LINE ADVANCING を指定します。ファイル名を指定しない場合、前者には LPT1、後者には LPT2 がデフォルトで使用されます。これらのファイルは、それぞれカレントディレクトリ内の物理ファイル LPT1 または LPT2 にマップされます。
Server Express は、3 種類の特殊なメッセージストリームをサポートしています。1 つは入力用、他の 2 つは出力用で、それぞれ標準入力、標準出力、標準エラーと呼ばれます。これらのメッセージストリームには、さまざまな方法で COBOL からアクセスできます。具体的には、ACCEPT、DISPLAY、STOP リテラル といったシンプルな文を使用したり、ファイル名として特殊デバイス名を指定したファイルに対して通常的なファイル操作を実行します (特殊デバイス名については、前述の『COBOL の特殊デバイス名』を参照してください)。
UNIX オペレーティングシステムでは、標準入力、標準出力、および標準エラーは特殊デバイスまたはファイルとして扱われ、COBOL ストリームがダイレクトに割り当てられます。これらの特殊ファイルに割り当てられたストリームは、さまざまな方法でリダイレクトできます (標準は端末です)。
コンパイラやランタイムシステムを含む Server Express の全コンポーネントでは、標準入力、標準出力、および標準エラーが必要に応じて使用されます。通常の出力とエラー出力が論理的に区別されており、オペレーティングシステムがそれぞれ別にリダイレクトする点に注意してください。
次のプログラム (demo.cbl) は、標準入力から 1 行のデータを読み取り、標準出力と標準エラーにそれぞれ 1 行のデータを出力します。プログラムに続いて、それを実行するコマンド行を示しています。このコマンド行は demo.in ファイルを標準入力にリダイレクトし、標準出力を demo.out、標準エラーを demo.err にそれぞれリダイレクトします。なお、demo.in ファイルには、Redirected input! という文字列が格納されているものとします。リダイレクトはオペレーティングシステムによって実行されるため、このコマンド行は COBOL システムではなく、オペレーティングシステムに制御されます。
working-storage section. 01 tmp pic x(20). procedure division. accept tmp from sysin. display "Message stdout is: " tmp upon sysout display "This is a message to stderr" upon syserr.
次にコマンド行を示します。
cobrun demo <demo.in >demo.out 2>demo.err
このコマンド行を実行すると、demo.out に Message to stdout is: Redirected input!、demo.err に This is a message to stderr がそれぞれ出力されます。
COBOL プログラムは、次の 2 通りの方法で端末デバイスにアクセスできます。どちらの方法でも、ACCEPT または DISPLAY を使用します。
端末を CONSOLE デバイスとして扱う場合、Server Express は特別な処理を行わず、オペレーティングシステム標準の端末サポートを使用します。
フォーマットされた画面入出力では、Server Express は論理レベルと物理レベルの両方で処理を行います。具体的には、高水準の COBOL 指令を Adis モジュールで端末に依存しない低水準の論理指令に変換し、続いてランタイムシステムによって端末操作に必要な端末依存指令に変換します。端末からの応答は、ランタイムシステムで論理指令に変換された後、Adis モジュールに渡されます。
UNIX システムはほとんどの端末に接続することができます。Adis モジュールで生成される端末に依存しない指令と、端末デバイスで使用される物理文字列およびエスケープシーケンスとの変換は、ランタイムシステムの画面操作モジュールで実行されます。このモジュールは COBOL システムの一部ですが、端末操作には UNIX 標準の方法を使用します。つまり、TERM 環境変数に格納されている端末の種別名と UNIX の terminfo システムデータベースに格納されている当該種別の詳細情報に基づく方法です。terminfo データベースに必要最小限の情報が見つからない場合は、ランタイムシステムがエラーを生成します。Server Express における端末機能の指定および使用方法の詳細については、『Server Express ユーザガイド』の『Terminfo データベースおよび端末装置』を参照してください。
画面操作モジュールは、UNIX 標準の入出力デバイスを介して端末を操作します。端末入出力はリダイレクトできますが、標準入力にリダイレクトするファイルには、必ず端末デバイスを使用する必要があります。次に有効なリダイレクトの例を示します。
cobrun prog < ` tty ` > ` tty `
通常の物理ファイルや /etc/null をリダイレクトするとランタイムエラーになります。なお、この例を実際に試すときにはアポストロフィ記号に注意してください。' ではなく、 ` を使用します。
Server Express の COBOL コンパイラは、特殊名段落内で宣言されているさまざまな機能名 (function-name)
を認識します (特殊名段落については、『言語リファレンス』を参照してください)。これらの機能名は、手続き部から関連する呼び名で参照することが可能です。認識される機能名は
COBOL の方言によって異なります。次の表は、Server Express の COBOL コンパイラが認識する機能名を、COBOL の方言ごとに示しています。また、それぞれの機能名の意味と、その参照に使用される
COBOL 文も示しています。なお、表中の Y
は、その機能名が当該方言で認識されることを意味します。U
が明示されている機能名は Server Express とメインフレーム版のコンパイラで認識されますが、メインフレーム版のマニュアルにはその旨が明記されていません。Y
、U
のどちらも明示されていない機能名は、該当する COBOL 方言では認識されません。
機能名 | 意味 | 参照に使用できる文 | COBOL 方言 | ||||
---|---|---|---|---|---|---|---|
MF | XOPEN | OSVS | VSC2 | ||||
2 | 3 | ||||||
COMMAND-LINE | メインプログラムを呼び出したコマンド行。システムのコマンド行のかわりに使用できる。 | ACCEPT および DISPLAY | Y | ||||
PRINTER | システムの論理プリンタ | DISPLAY | Y | ||||
TAB | タブ位置まで移動 | WRITE | Y | ||||
ARGUMENT-
NUMBER |
COMMAND-LINE の要素数 | ACCEPT および DISPLAY | Y | Y | |||
ARGUMENT-
VALUE |
COMMAND-LINE の要素の値 | ACCEPT | Y | Y | |||
ENVIRONMENT-
NAME |
環境変数名 | DISPLAY | Y | Y | |||
ENVIRONMENT-
VALUE |
環境変数に関連付けられている値 | ACCEPT および DISPLAY | Y | Y | |||
SYSERR | システムの論理エラーデバイス | DISPLAY | Y | Y | |||
SYSIN | システムの論理入力デバイス | ACCEPT | Y | Y | Y | Y | Y |
SYSIPT | システムの論理入力デバイス | ACCEPT | Y | U | U | Y | |
SYSOUT | システムの論理出力デバイス | DISPLAY | Y | Y | Y | Y | Y |
SYSLIST | システムの論理出力デバイス | DISPLAY | Y | Y | |||
SYSLST | システムの論理出力デバイス | DISPLAY | Y | U | U | Y | |
SYSPCH | システムの論理出力デバイス | DISPLAY | Y | U | U | Y | |
SYSPUNCH | システムの論理出力デバイス | DISPLAY | Y | U | Y | Y | |
CONSOLE | システムの論理入出力デバイス | ACCEPT および DISPLAY | Y | Y | Y | Y | |
C01 | プリンタチャンネル 1 へスキップ | WRITE | Y | Y | Y | Y | |
C02 〜 C12 | 該当するプリンタチャンネル (2 〜 12) へスキップ | WRITE | Y | Y | Y | Y | |
S01 〜 S02 | パンチポケットを選択 | WRITE | Y | Y | Y | Y | |
S03 〜 S05 | パンチポケットを選択 | WRITE | Y | U | Y | ||
CSP | 行送り抑止 | WRITE | Y | Y | Y | Y | |
文字定数 | 報告書コード | CODE 句 | Y | Y |
COMMAND-LINE は、COBOL アプリケーションのコマンド行のかわりに使用できます。詳細については、『言語リファレンス』の『ACCEPT 文』および『DISPLAY 文』の説明を参照してください。
ARGUMENT-NUMBER と ARGUMENT-VALUE は、いずれも X/Open で定義された方法に従ってコマンド行にアクセスする場合に利用できます。詳細については、『言語リファレンス』の『ACCEPT 文』および『DISPLAY 文』の説明を参照してください。
ENVIRONMENT-NAME と ENVIRONMENT-VALUE は、いずれもオペレーティングシステムに設定されている環境変数に X/Open で定義された方法に従ってアクセスするときに利用できます。詳細については、『言語リファレンス』の『ACCEPT 文』および『DISPLAY 文』の説明を参照してください。
FORMFEED と TAB は、ADVANCING 指定を指定した WRITE 文の使用時に、LINE ADVANCING プリンタ出力ファイル内で水平および垂直方向の位置を調整する手段として利用できます。LINE ADVANCING ファイルの詳しい形式については、『ファイル操作』を参照してください。
PRINTER は、メインフレーム環境で開発したソースコードに互換性を与えるための機能名です。ただし、この機能名は特に理由がない限り、使用すべきではありません。また、入出力節 (INPUT-OUTPUT SECTION) で SELECT 句に指定する PRINTER 句と混同しないように注意してください。
DISPLAY
data-item UPON PRINTER
文は、data-item に指定したデータ項目の内容を 1 つのレコードとして、パイプ経由でプリントスプーラに書き出します。レコードの書き出しに成功するとパイプは閉じられます。標準で実行されるスプーラは
lp ですが、COBPRINTER 環境変数でその他のスプーラプロセスを指定することも可能です。COBPRINTER の詳細については、『Server
Express ユーザガイド』の『環境変数』を参照してください。
システムの論理入力、論理出力、および論理エラーデバイスは、それぞれ COBOL の特殊デバイス :CI:、:CO:、および :CE: にマッピングされます。
CONSOLE を指定した場合は、ACCEPT 文と DISPLAY 文が COBOL の特殊デバイス、 :CI: に入力、:CO: に出力をそれぞれマッピングします。この機能名を FROM CRT 指定や画面節の項目とともに使用することはできません。
C01 〜 C12 のプリンタチャンネルは改行と書式送りでエミュレートされます。これらのチャンネルに出力を行うには、COBLPFORM 環境変数で書式上の行番号を設定する必要があります。次に示すように、一連の番号をコロンで区切って設定します。
COBLPFORM=1:::::::::::60 export COBLPFORM
このように定義すると、チャンネル 1 が 1 行め (ページの先頭)、チャンネル 12 が 60 行めにそれぞれ設定されます。1 つのチャンネルに設定できる行番号は 1 つのみです。行番号ゼロ、機能名 S01 〜 S052、CSP、および未定義の行は、すべて 1 行めに設定されます。COBLPFORM 環境変数の詳細については、『Server Express ユーザガイド』の『環境変数』を参照してください。
WRITE BEFORE/AFTER PAGE 文の出力は常に 1 行めから開始されます。次の行に移動するたびに行番号が 1 つ増加します。現在の行と同じ、またはそれ以前の行への移動を要求すると次のページに移動し、要求に応じた行まで改行が生成されます。
WRITE BEFORE/AFTER TAB 文を実行すると、常に書式送りが生成されます。この文以降に特定チャンネル番号へのスキップを要求すると、次のページに移動します。
このリテラルの値は、実行にはまったく影響を与えません。
Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.