7.8 f90_unix_proc
このモジュールは ISO/IEC 9945-1:1990 Portable Operating System Interface (POSIX) - Part 1: System Application Program Interface (API) [C Language] で詳細に規定される機能に対するFortran APIの一部を提供するものです。
このモジュール中の関数はセクション3.3 シグナルを除くセクション3 プロセス
プリミティブに由来するものです。
C言語関数abort
, atexit
, exit
, system
もこのモ
ジュールによって提供されます。
エラー処理についてはF90_UNIX_ERRNO
に記述されています。
省略可能なERRNO
引数を用いた手続きに対し、エラーが生じERRNO
が存在しなかった場合には、プログラムは終了させられる点に注意してください。
このモジュール中のすべての手続きは総称的なものです。いくつかは個別的でもありま すが、これは将来リリースで変わる可能性があります。
7.8.1 パラメータ
INTEGER(int32),PARAMETER :: atomic_intシグナルハンドラ(
ALARM
参照)中のアトミック(“atomic”)な
操作に対する整数種別。
INTEGER(int32),PARAMETER :: atomic_logシグナルハンドラ(
ALARM
参照)中のアトミックな操作に対する論理種別。
USE f90_unix_env, ONLY: pid_kind=>id_kindプロセスIDを表現するための整数種別。これは
F90_UNIX_ENV
より
ID_KIND
によって置き換えられています。
USE f90_unix_env, ONLY: time_kind時刻を秒で表現するための整数種別。
INTEGER(int32),PARAMETER :: wnohang呼出し元プロセスが子プロセスの終了を待つべきではないことを示す
WAITPID
に対するオプションビット。
INTEGER(int32),PARAMETER :: wuntraced強制終了させられたプロセスのみならず終了したものについてもステータス情報が 返されるべきであることを示す
WAITPID
に対するオプションビット。
7.8.2 プロシジャ
SUBROUTINE abort(message) CHARACTER(*),OPTIONAL :: message
ABORT
はI/Oバッファをクリーンアップし、実行を終了させ、コアダンプをUnix
システム上に出力します。MESSAGE
が与えられた場合には、それは
‘ abort:
’が先頭に付加された形で論理装置0に出力されます。
SUBROUTINE alarm(seconds,subroutine,secleft,errno) INTEGER(*),INTENT(IN) :: seconds INTERFACE SUBROUTINE subroutine() END END INTERFACE OPTIONAL subroutine INTEGER(time_kind),OPTIONAL,INTENT(OUT) :: secleft INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno
SECONDS
秒後に手続きSUBROUTINE
に対し“alarm”コールがかかる
ように設定します。SECONDS
==0の場合には既存のアラームをキャンセルします。
SUBROUTINE
が存在しなかった場合でも、それ以前に設定されたサブルーチンと
アラームシグナルとの対応付けには変更は行われません。
SECLEFT
が存在する場合、それによって先行するアラーム上で残存する秒数を
受け取ることができます。既存のアラームが存在しない場合には0でセットされます。
アラームコールで呼ばれるサブルーチン中では、型がINTEGER(atomic_int)
か
LOGICAL(atomic_log)
の非同期保存変数(VOLATILE
SAVE
d
variables)の定義のみが許されます。他の種類の変数を定義したり参照した場合には
予期せぬ帰結を招いたり、プログラム終了を招いたりすることがあります。
さらにその中では配列や文字(CHARACTER
)の操作、入出力、組込み関数や
モジュール手続きの呼出しを行ってはなりません。
ハンドラを持たない形でアラームコールが設定されている場合(すなわち最初のコール
でSUBROUTINE
の指定がなかった場合)には、アラーム発生と共にプロセスは終
了させられます。
起りうるエラーにはENOSYS
があります。
SUBROUTINE atexit(subroutine,errno) INTERFACE SUBROUTINE subroutine() END END INTERFACE INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errnoプログラムの正常終了時に実行されるべき引数なしのサブルーチンを登録します。
プログラムが正常に終了した場合には、ATEXIT
で登録されたサブルーチン
は登録の新しいものから順にすべて呼び出されます。
正常終了にはF90_UNIX_PROC
のEXIT
手続きを使用する方法、
FortranのSTOP
文を実行する方法、メインプログラムのEND
を実行する方法があります。
ATEXIT
サブルーチンは自動的なファイルクローズより前に呼び出されます。
プログラムがエラーによって、あるいはF90_UNIX_PROC
のFASTEXIT
手続きの使用によって終了した場合には、これらのサブルーチンは呼び出されま
せん。
起りうるエラーにはENOMEM
があります。
注:Fortranによって登録されるATEXIT
手続きのリストはCによって登録さ
れるものとは別物です。後者はすべてのファイルがクローズされた後に呼び出さ
れます。
SUBROUTINE execl(path,arg0...,errno) CHARACTER(*),INTENT(IN) :: path CHARACTER(*),INTENT(IN) :: arg0... INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno
EXECV
と同様、現行イメージではなくファイルから実行します。
新たなプログラムへの引数はARG0
, ARG1
等、最大でARG20
まで
の名称を持った仮引数で指定されます(これ以上の数の引数が将来リリースで追加さ
れることもあります)。
これらは省略可能な引数ではない点に注意してください。それ自身が省略可能
な仮引数である実引数もすべて指定されなくてはなりません。
引数が配列ではなく個別に提供されるという点を除けば、この関数はEXECV
と
変わるところはありません。これらの引数は個別に提供されるため、長さの指定は
必要ありません(長さはそれぞれの引数自身から求められます)。
エラーはEXECV
に対するものと同一です。
SUBROUTINE execlp(file,arguments,,errno) CHARACTER(*),INTENT(IN) :: file CHARACTER(*),INTENT(IN) :: arguments INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno
EXECV
と同様、現行イメージではなくファイルから実行します。
新たなプログラムへの引数はARG0
, ARG1
等、最大でARG20
まで
の名称を持った仮引数で指定されます(これ以上の数の引数が将来リリースで追加さ
れることもあります)。
これらは省略可能な引数ではない点に注意してください。それ自身が省略可能
な仮引数である実引数もすべて指定されなくてはなりません。
実行すべきプログラムの決定がEXECVP
と同一のルールに従うという点を除け
ば、この関数はEXECL
と変わるところはありません。
エラーはEXECV
に対するものと同一です。
SUBROUTINE execv(path,argv,lenargv,errno) CHARACTER(*),INTENT(IN) :: path CHARACTER(*),INTENT(IN) :: argv(:) INTEGER(*),INTENT(IN) :: lenargv(:) INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno現行のプロセスイメージの代りにファイル
PATH
を実行します。詳細は
ISO/IEC 9945-1:1990セクション3.1.2をご参照ください。
ARGV
は引数文字列の配列であり、LENARGV
には個々の引数に対する
望ましい長さが含まれています。
ARGV
のサイズが0でない場合、ARGV(1)(:LENARGV(1))
は引数0(プロ
グラム名)として引き渡されます。
LENARGV
とARGV
の形状が異なる場合、エラーEINVAL
が発生し
ます(F90_UNIX_ERRNO
参照)。
起りうるエラーにはE2BIG
, EACCES
, ENAMETOOLONG
,
ENOENT
, ENOTDIR
, ENOEXEC
, ENOMEM
があります。
SUBROUTINE EXECVE(path,argv,lenargv,env,lenenv,errno) CHARACTER(*),INTENT(IN) :: path CHARACTER(*),INTENT(IN) :: argv(:) INTEGER(*),INTENT(IN) :: lenargv(:) CHARACTER(*),INTENT(IN) :: env(:) INTEGER(*),INTENT(IN) :: lenenv(:) INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno
EXECV
と同様、ENV
とLENENV
で指定される環境文字列が新たな
プログラムに引き渡されます。詳細はISO/IEC 9945-1:1990セクション3.1.2をご参照
ください。
LENARGV
とARGV
の形状が異なる場合、またはLENENV
と
ENV
の形状が異なる場合、エラーEINVAL
が発生します
(F90_UNIX_ERRNO
参照)。
他のエラーについてはEXECV
と同一です。
SUBROUTINE execvp(file,argv,lenargv,errno) CHARACTER(*),INTENT(IN) :: file CHARACTER(*),INTENT(IN) :: argv(:) INTEGER(*),INTENT(IN) :: lenargv(:) INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno実行対象のプログラム
FILE
がPATH
環境変数を使ってサーチされる点
以外はEXECV
と変わりません(スラッシュ文字が含まれている場合には、
EXECVP
は実効的にEXECV
と等価になります)。
エラーはEXECV
に対するものと同一です。
SUBROUTINE exit(status) INTEGER(int32),OPTIONAL,INTENT(IN) :: statusメインプログラムの
END
文(または非修飾のSTOP
文)を実行したか
のように実行を終了します。
STATUS
が与えられた場合には、実行ステータスコードとしてOSに返されま
す(適用可能な場合)。
SUBROUTINE fastexit(status) INTEGER,OPTIONAL,INTENT(IN) :: statusISO/IEC 9945-1:1990の
_exit
の機能(セクション3.2.2)を提供します。
FASTEXIT
とEXIT
の間には2つの主だった違いがあります:
-
EXIT
がコールされた場合には、オープンされているすべての論理装置が (CLOSE
文が実行されたかのような形で)クローズされます。FASTEXIT
に対してはこれが行われず、またファイルバッファの掃出しも 行われません。このためFASTEXIT
をコールした時点で接続されている ファイルの内容と状態は不定となります。 -
ATEXIT
で登録されているサブルーチンは実行されません。
SUBROUTINE fork(pid,errno) INTEGER(id_kind),INTENT(OUT) :: pid INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno呼出し元プロセスと全く同一のコピーである新たなプロセスを作成します。 新たなプロセスにおいて
PID
中に返される値は0となります。一方、呼出し元
プロセスの場合、PID
中に返される値は新たに生成された(子)プロセスの
プロセスIDとなります。
起りうるエラーにはEAGAIN
, ENOMEM
, ENOSYS
があります
(F90_UNIX_ERRNO
参照)。
SUBROUTINE pause(errno) INTEGER(error_kind),INTENT(OUT) :: errnoシグナルが発生するまでプロセスの実行を抑止します。 シグナルに伴うアクションがプロセスの終了であった場合、プロセスは
PAUSE
から戻ることなく終了させられます。
シグナルに伴うアクションがシグナルハンドラーを呼び出すことであった場合
(例えばALARM
による場合)、プロセスの実行はシグナルハンドラーから
戻った後に再開されます。
プロセス実行がシグナル後も継続される場合、ERRNO
はEINTR
にセッ
トされます。
この機能が利用できない場合にはERRNO
はENOSYS
にセットされます。
PURE SUBROUTINE sleep(seconds,secleft) INTEGER(*),INTENT(IN) :: seconds INTEGER(time_kind),OPTIONAL,INTENT(OUT) :: secleftプロセス実行を
SECONDS
秒の間、またはシグナルが届くまで中断します。
SECLEFT
が存在する場合、スリープ時間として残っている秒数を受け取ることが
できます(スリープがシグナルによって割り込まれたのでない場合には0)。
SUBROUTINE system(string,status,errno) CHARACTER(*),INTENT(IN) :: string INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: status,errno実行のため
STRING
をコマンドプロセッサに引き渡します。
STATUS
が存在する場合には完了ステータスを受け取ることができます。これ
はWAIT
によって返されるのと同一のステータスであり、WIFEXITED
等
を使ってデコードすることができます。
ERRNO
が存在する場合には、SYSTEM
コール自身からのエラーステータ
スが返されます。
起りうるエラーはFORK
またはEXECV
からのものです。
SUBROUTINE wait(status,retpid,errno) INTEGER(int32),OPTIONAL,INTENT(OUT) :: status INTEGER(id_kind),OPTIONAL,INTENT(OUT) :: retpid INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errnoいずれかの子プロセスの終了を待ちます(既に終了しているものがあれば即座に リターンとなります)。 詳細はISO/IEC 9945-1:1990セクション3.2.1をご参照ください。
STATUS
が存在する場合には子プロセスの終了ステータスを受け取ることが
できます。
RETPID
が存在する場合には子プロセスのプロセス番号が返されます。
起りうるエラーにはECHILD
, EINTR
があります
(F90_UNIX_ERRNO
参照)。
SUBROUTINE waitpid(pid,status,options,retpid,errno) INTEGER(id_kind),INTENT(IN) :: pid INTEGER(int32),OPTIONAL,INTENT(OUT) :: status INTEGER(int32),OPTIONAL,INTENT(IN) :: options INTEGER(id_kind),OPTIONAL,INTENT(OUT) :: retpid INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errno特定の子プロセスの終了(
PID==(-1)
の場合にはどれか一つの終了)を待ちます。
OPTIONS
が存在しない場合には、それに対する値が0を指定されたかのように処理
されます。
詳細はISO/IEC 9945-1:1990セクション3.2.1をご参照ください。
起りうるエラーにはECHILD
, EINTR
, EINVAL
があります
(F90_UNIX_ERRNO
参照)。
PURE INTEGER(int32) FUNCTION wexitstatus(stat_val) INTEGER(int32),INTENT(IN) :: stat_val
WIFEXITED(STAT_VAL)
が.TRUE.
の場合、子プロセスによってEXIT
またはFASTEXIT
に供給されるステータス値の下位8ビットがこの関数の応答とし
て返されます。
子プロセスがSTOP
文、またはメインプログラムのEND
文を実行した場合
には、値は0となります。
WIFEXITED(STAT_VAL)
が.FALSE.
の場合、関数値は不定です。
PURE LOGICAL(word) FUNCTION wifexited(stat_val) INTEGER(error_kind),INTENT(IN) :: stat_val子プロセスが
FASTEXIT
, EXIT
をコールすることによって、または
STOP
文、またはメインプログラムのEND
文の実行によって、または
Fortran以外の方法によって終了した場合に限り、.TRUE.
を応答として返
します。
PURE LOGICAL(word) FUNCTION wifsignaled(stat_val) INTEGER(int32),INTENT(IN) :: stat_val子プロセスがキャッチされなかったシグナルの受信により終了した場合に限り
.TRUE.
を応答として返します。
PURE LOGICAL(word) FUNCTION wifstopped(stat_val) INTEGER(int32),INTENT(IN) :: stat_val子プロセスが停止させられた(終了はしていない)場合に限り
.TRUE.
を応答として返します。このようなステータス値を受け取るには、
WUNTRACED
オプションを指定したWAITPID
が使用されていなくては
ならない点に注意してください。
PURE INTEGER(int32) FUNCTION wstopsig(stat_val) INTEGER(int32),INTENT(IN) :: stat_val
WIFSTOPPED(STAT_VAL)
が.TRUE.
の場合、この関数は子プロセスの
停止をもたらしたシグナル番号を応答として返します。
WIFSTOPPED(STAT_VAL)
が.FALSE.
の場合、関数値は不定となります。
PURE INTEGER(int32) FUNCTION wtermsig(stat_val) INTEGER(int32),INTENT(IN) :: stat_val
WIFSIGNALED(STAT_VAL)
が.TRUE.
の場合、この関数は子プロセスの
終了をもたらしたシグナル番号を応答として返します。
WIFSIGNALED(STAT_VAL)
が.FALSE.
の場合、関数値は不定となります。