Room:「Conference Room SAD」

stdin/stdout/stdout

Speaker:noboru.yamamoto@kek.jp

(Date: Monday, July 2, 2001 12:20:22)


標準入出力とエラーメッセージ出力について。

 Unixシステムでは通常stdin/stdout/stderrの三つの入出力チャンネルが夫々のプロセスに割り当てられており、
標準入力、標準出力、および標準エラー出力として使われている。標準出力と標準エラー出力を別チャンネルとすることで、
パイプ機能などで、エラー出力を用意に標準出力から分離出来るわけである。

  現状のSADをみてみると、標準出力とエラー出力が同じチャンネルに出力されておりこれらを分離することが困難である。
ソースコードを眺めてみると、inc/MACFILE.incにおいて、

parameter (STDERR=6,STDIN=5,STDOUT=6,STDPLT=8, STDLST=21)

となっており、一応標準出力とエラー出力の分離は当初から考慮されていたものの、実質的には同じ
出力チャンネル(Logical Unit Number =6)に出力されている。STDERRを6以外のものにすることが可能かどうかということで、
調査してみたので、その途中報告を行う。

 まず、Unixでのstdin/stdout/stderrはUnix File descriptorの0/1/2の夫々対応しており、これは調査したすべてのUnix,
OSF1/HP-UX/Linuxで同じ設定になっている。一方フォートランでは標準入出力は伝統的に(規格上?)
Logical unit numberの5および6に割り当てられており、内部的にはこれらのLogical Unit numberは
Unix File descriptorの 0 および 1 (つまりはstdin/stdout)に割り当てられている。

 stderrはフォートランでは特に規定が無いためかコンパイラにより異なったlogical Unit number に割り当てられている。
OSF1 fortran compilerおよびgccではstderrはlogical unit number 0に、HP-UX fortran ではlogical unit number
7に割り当てられている。したがって、STDERR=0あるいはSTDERR=7とするだけでは、これらのプラットホームに共通の
ソースコードを適用することが出来ない。MACFILE.inc中でコンパイラ毎に適切な値を設定するための仕組みを導入してやるか、
ファイルの初期化時に適切にstderrを共通のLogical Unit Numberに割り当ててやる必要がある。

此処で問題をやや複雑にしているのは、OSF1 fortran compilerでは、標準入出力・エラー出力はlogical unit number
5/6/0 に割り当てられてはいるものの、Openはされていないということである。このため、初期化時にフォートランのレベルから、LUN=0がオープンされているかどうかを判定することでは、これがOSF1 fortranコンパイラでコンパイルされた実行形式ファイルであるかどうかをきめることは出来ない。

いまのところ、STDERR=7として、

c
inquire(unit=STDERR, opened=opn,iostat=ios)
if (.not. opn) then
inquire(unit=0, opened=opn,iostat=ios)
if (.not. opn) then
write(0,*)
endif
open(STDERR ,file="fstderr",access="append")
call dup2(fnum(0),fnum(STDERR))
endif

をinifil.fに付け加えることで、OSF1/HP-UX/Linux(g77)のいずれでもLUN=7を標準エラー出力としてわり当てる事が
できると考えている。この変更によって支障が生じる様な応用があればご一報いただきたい。

Noboru Yamamoto
KEKB Control gro up



Comment by Kentaro Harada
( Date: Tuesday, July 3, 2001 15:12:25)

前略
 
  東大物性研の原田です。大変お世話になっております。
どうもありがとうございます。
 
  「標準入力」ですが、LINUX と DEC で番号が違う様なの
ですが、それは統一することは難しいのでしょうか? 例えば、
キーボードから値を入力して読み込むスクリプトは、LINUXでは
a = Read[5,Real]; ですが、acsad では a = Read[6,Real];
です。(どちらも入れ替えると読み込めません。なお、標準
出力はどちらも6です。(例えば、FFS["cell calc emit",6];で
画面に出ます。) 出入力の番号が同じなのはちょっと不信なの
ですが、そうなっているようです。) 
 
  どうぞ、ご検討下さいます様、お願い申し上げます。
 
                     草々
                Tuesday,3,July,2001
                  Kentaro Harada