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 :: messageABORTは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) :: errnoSECONDS秒後に手続きSUBROUTINEに対し“alarm”コールがかかる ように設定します。SECONDS==0の場合には既存のアラームをキャンセルします。 SUBROUTINEが存在しなかった場合でも、それ以前に設定されたサブルーチンと アラームシグナルとの対応付けには変更は行われません。 SECLEFTが存在する場合、それによって先行するアラーム上で残存する秒数を 受け取ることができます。既存のアラームが存在しない場合には0でセットされます。
アラームコールで呼ばれるサブルーチン中では、型がINTEGER(atomic_int)か LOGICAL(atomic_log)の非同期保存変数(VOLATILE SAVEd 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) :: errnoEXECVと同様、現行イメージではなくファイルから実行します。 新たなプログラムへの引数はARG0, ARG1等、最大でARG20まで の名称を持った仮引数で指定されます(これ以上の数の引数が将来リリースで追加さ れることもあります)。 これらは省略可能な引数ではない点に注意してください。それ自身が省略可能 な仮引数である実引数もすべて指定されなくてはなりません。 引数が配列ではなく個別に提供されるという点を除けば、この関数はEXECVと 変わるところはありません。これらの引数は個別に提供されるため、長さの指定は 必要ありません(長さはそれぞれの引数自身から求められます)。
エラーはEXECVに対するものと同一です。
SUBROUTINE execlp(file,arguments,,errno) CHARACTER(*),INTENT(IN) :: file CHARACTER(*),INTENT(IN) :: arguments INTEGER(error_kind),OPTIONAL,INTENT(OUT) :: errnoEXECVと同様、現行イメージではなくファイルから実行します。 新たなプログラムへの引数は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) :: errnoEXECVと同様、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_valWIFEXITED(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_valWIFSTOPPED(STAT_VAL)が.TRUE.の場合、この関数は子プロセスの 停止をもたらしたシグナル番号を応答として返します。 WIFSTOPPED(STAT_VAL)が.FALSE.の場合、関数値は不定となります。
PURE INTEGER(int32) FUNCTION wtermsig(stat_val) INTEGER(int32),INTENT(IN) :: stat_valWIFSIGNALED(STAT_VAL)が.TRUE.の場合、この関数は子プロセスの 終了をもたらしたシグナル番号を応答として返します。 WIFSIGNALED(STAT_VAL)が.FALSE.の場合、関数値は不定となります。