第 15 章 デバイス操作

COBOL はさまざまなデバイスを明示的または暗黙のうちに認識します。この章では、各種デバイスの COBOL に属する側面とオペレーティングシステムに依存する側面を取り上げ、これらのデバイスを使用できるように構成し、COBOL からアクセスする方法を説明します。

15.1 概要

COBOL 言語はさまざまな種類の論理デバイスを認識し、ランタイムシステムによって該当する物理デバイスに自動的にマッピングします。ファイルの場合は、ランタイムシステムやオペレーティングシステムがデバイスとして認識するファイルの名前を明示的に指定することによって、この自動マッピングをオーバーライドすることが可能です。ただし、ファイル名はオペレーティングシステムに依存するため、この方法は、移植性を重視するプログラムで使用すべきではありません。

COBOL 言語で自動的に認識される論理デバイスは、次の 4 つのカテゴリに分類されます。

COBOL のファイルは通常、オペレーティングシステムがサポートするファイルシステムにマッピングされますが、物理プリンタやプリントスプーラ、名前付きパイプ、論理デバイス、デバイスドライバなど、他のデバイスや関数にマッピングすることも可能です。ランタイムシステムが特定のファイル名を区別して認識したり、オペレーティングシステムからファイルの種類を取り込んだ結果、一部のファイルが特殊な論理デバイスや物理デバイスに関連付けられる可能性もあります。

COBOL では、書式設定のないシンプルな ACCEPT 文に標準入力デバイス、書式設定のない単純な DISPLAY 文と STOP リテラル 文に標準出力デバイスをそれぞれ使用することが前提になります。これらの標準論理デバイスはコンソールに直接マッピングできるほか、オペレーティングシステムの標準入出力デバイスを介して間接的にマッピングすることも可能です。

COBOL の ACCEPT 文と DISPLAY 文は、スクロールなしの全画面フォームにも対応しており、これは COBOL ランタイムシステムによって物理端末デバイスや論理端末デバイスにマッピングされます。

COBOL では、ソースプログラムの構成部 (CONFIGURATION SECTION) で機能名 (function-name) を宣言することによって、論理デバイスに依存する機能を指定できます (『言語リファレンス』の『特殊名段落』を参照)。これらの機能は、オペレーティングシステムの該当する機能にマッピングされます。

15.2 ファイルデバイス

COBOL のファイルは通常、オペレーティングシステムがサポートするファイルシステムにマッピングされるため、COBOL システムは固定メディアやリムーバブルメディアのデバイスを検出できません (『ファイル操作を参照)。

COBOL ファイルのマッピング先は、次の 3 つの方法で変更することが可能です。

いずれの場合も、COBOL ファイルは標準ファイルシステム上のファイル以外にマッピングされるため、COBOL プログラムも特殊なデバイスの使用に伴う制約に従う必要があります。たとえば、プリンタを入力に使用したり、磁気テープデバイスを索引ファイルやランダムアクセスファイルとして使用したりすることはできず、名前付きパイプによるレコードロック構文の使用も禁止されます。

15.2.1 COBOL の特殊デバイス名

次の表 15-1 は、UNIX 版の COBOL ランタイムシステムで認識される特殊デバイス名を示しています。

Server Express のランタイムシステムは、大文字と小文字を区別してデバイス名を認識します。

COBOL システムで特殊デバイス名として認識される文字列は、ファイルシステム上のファイルにアクセスする際のファイル名として使用すべきではありません。

デバイス名 対象となるオペレーティングシステムのデバイス
:CI:
stdin
標準入力ストリーム
:CO:
stdout
標準出力ストリーム
:CE:
stderr
標準エラーストリーム (利用できない場合は標準出力ストリーム)

表 15-1 COBOL の特殊デバイス名

15.2.2 オペレーティングシステムの特殊デバイス名

表 15-2 は、オペレーティングシステムで認識される最も一般的な特殊デバイス名を示しています。ここで紹介していない特殊デバイスについては、使用しているオペレーティングシステムのマニュアルを参照してください。

ファイル名 オペレーティングシステムの該当デバイス
/dev/null 出力を無視するデバイス
/dev/floppy フロッピーディスクドライブ
/dev/cart0 カートリッジテープドライブ

表 15-2 オペレーティングシステムの特殊デバイス名

UNIX オペレーティングシステムでは、名前付きパイプなどの特殊なファイルに、任意のファイル名を付けることができます。

フロッピーディスクドライブやテープカートリッジドライブなどのデバイスに使用されるファイル名は、 UNIX のバージョンごとに異なり、同じバージョンでもインストール環境によって異なる場合があります。そのため、上記の特殊デバイス名は例にすぎません。

プログラムの移植性を重視する場合は、ファイルシステム上のファイルにアクセスする際のファイル名として、他のオペレーティングシステムで特殊デバイス名として認識される文字列を使用すべきではありません。

15.2.3 COBOL の特殊デバイス句

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 にマップされます。

15.3 標準入出力デバイスおよび標準エラーデバイス

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 がそれぞれ出力されます。

15.4 端末デバイス

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 をリダイレクトするとランタイムエラーになります。なお、この例を実際に試すときにはアポストロフィ記号に注意してください。' ではなく、 ` を使用します。

15.5 機能名と関連デバイス

Server Express の COBOL コンパイラは、特殊名段落内で宣言されているさまざまな機能名 (function-name) を認識します (特殊名段落については、『言語リファレンス』を参照してください)。これらの機能名は、手続き部から関連する呼び名で参照することが可能です。認識される機能名は COBOL の方言によって異なります。次の表は、Server Express の COBOL コンパイラが認識する機能名を、COBOL の方言ごとに示しています。また、それぞれの機能名の意味と、その参照に使用される COBOL 文も示しています。なお、表中の Y は、その機能名が当該方言で認識されることを意味します。U が明示されている機能名は Server Express とメインフレーム版のコンパイラで認識されますが、メインフレーム版のマニュアルにはその旨が明記されていません。YU のどちらも明示されていない機能名は、該当する 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

COMMAND-LINE は、COBOL アプリケーションのコマンド行のかわりに使用できます。詳細については、『言語リファレンスの『ACCEPT 文』および『DISPLAY 文』の説明を参照してください。


ARGUMENT-NUMBER および ARGUMENT-VALUE

ARGUMENT-NUMBER と ARGUMENT-VALUE は、いずれも X/Open で定義された方法に従ってコマンド行にアクセスする場合に利用できます。詳細については、『言語リファレンスの『ACCEPT 文』および『DISPLAY 文』の説明を参照してください。


ENVIRONMENT-NAME および ENVIRONMENT-VALUE

ENVIRONMENT-NAME と ENVIRONMENT-VALUE は、いずれもオペレーティングシステムに設定されている環境変数に X/Open で定義された方法に従ってアクセスするときに利用できます。詳細については、『言語リファレンスの『ACCEPT 文』および『DISPLAY 文』の説明を参照してください。


FORMFEED および TAB

FORMFEED と TAB は、ADVANCING 指定を指定した WRITE 文の使用時に、LINE ADVANCING プリンタ出力ファイル内で水平および垂直方向の位置を調整する手段として利用できます。LINE ADVANCING ファイルの詳しい形式については、『ファイル操作を参照してください。


PRINTER

PRINTER は、メインフレーム環境で開発したソースコードに互換性を与えるための機能名です。ただし、この機能名は特に理由がない限り、使用すべきではありません。また、入出力節 (INPUT-OUTPUT SECTION) で SELECT 句に指定する PRINTER 句と混同しないように注意してください。

DISPLAY data-item UPON PRINTER 文は、data-item に指定したデータ項目の内容を 1 つのレコードとして、パイプ経由でプリントスプーラに書き出します。レコードの書き出しに成功するとパイプは閉じられます。標準で実行されるスプーラは lp ですが、COBPRINTER 環境変数でその他のスプーラプロセスを指定することも可能です。COBPRINTER の詳細については、『Server Express ユーザガイド』の『環境変数』を参照してください。


システムの論理入出力およびエラーデバイス

システムの論理入力、論理出力、および論理エラーデバイスは、それぞれ COBOL の特殊デバイス :CI:、:CO:、および :CE: にマッピングされます。


CONSOLE

CONSOLE を指定した場合は、ACCEPT 文と DISPLAY 文が COBOL の特殊デバイス、 :CI: に入力、:CO: に出力をそれぞれマッピングします。この機能名を FROM CRT 指定や画面節の項目とともに使用することはできません。


プリンタチャンネル (C01 〜 C12)、S01 〜 S05、CSP

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 文を実行すると、常に書式送りが生成されます。この文以降に特定チャンネル番号へのスキップを要求すると、次のページに移動します。


CODE 句のリテラル

このリテラルの値は、実行にはまったく影響を与えません。



Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.