日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
HP OpenVMS
|
目次 | 索引 |
exit, _exit |
関数を呼び出したプログラムの実行を終了します。これらの関数は非リエントラントです。
#include <stdlib.h>void exit (int status);
#include <unistd.h>
void _exit (int status);
status
非 POSIX の動作では,状態値 EXIT_SUCCESS (1) または EXIT_FAILURE (2),または 3〜255 の数値。
- 状態値 0,1 または EXIT_SUCCESS は,OpenVMS の SS$_NORMAL 状態コードに変換され,OpenVMS の正常終了値を返します。
- 状態値 2 または EXIT_FAILURE はエラー・レベル終了状態に変換されます。状態値は親プロセスに渡されます。
- 他の状態値はそのまま変更されません。
For POSIX behavior:
- A status value of 0 is translated to the OpenVMS SS$_NORMAL status code to return the OpenVMS success value.
- Any other status is returned to the parent process as an OpenVMS message symbol with facility set to C, severity set to success, and with the status in the message number field. For more information on the format of message symbols, see "message code" in the HP OpenVMS Command Definition, Librarian, and Message Utilities Manual.
POSIX の動作を得るには, <unistd.h>を取り込み, _POSIX_EXIT 機能テスト・マクロを設定してコンパイルします ( ファイルを取り込む前に,ファイルの先頭に #define _POSIX_EXITを指定するか,または /DEFINE=_POSIX_EXIT を指定します )。この動作が可能なのは, OpenVMS Version 7.0 およびそれ以降のシステムの場合だけです。
プロセスが DCL で起動された場合,状態は DCL によって解釈され,メッセージが表示されます。プロセスが vforkまたは exec関数を使用して生成された子プロセスの場合は,子プロセスは終了し,制御は親に返されます。2 つの関数は同じです。 _exit関数が残されているのは, VAX C との互換性を維持するためです。
exit関数と _exit関数では, $EXIT システム・サービスを使用します。ハイバネーションおよびスケジューリングされたウェイクアップ修飾子を使用して RUN コマンドによってプロセスが起動される場合は, exitまたは _exit呼び出しが実行されたときに,プロセスはハイバネーション状態に正しく戻らないことがあります。
C コンパイラでは,コマンド行修飾子 /[NO]MAIN=POSIX_EXIT を使用することで, mainから戻るときに, exitではなく __posix_exitを呼び出させるようにできます。デフォルトは,/NOMAIN です。
OpenVMS Version 8.3 以降, execlが失敗した後の _exit の呼び出しが終了してしまうという C RTL における問題に対する修正が含まれています。
ほとんどの UNIX システムでは子プロセスが起動されますが, OpenVMS の vforkの実装では,子プロセスは起動されません。ただし,C RTL は,子プロセスの機能を再現するいくつかの内部データ構造体を作成します(チャイルド・コンテキストと呼ばれます)。
問題は,チャイルド・コンテキスト内の vfork の後, exec 関数の呼び出しが失敗し, _exitを呼び出すことにより発生します。 UNIX システムでは,呼び出しの実行に失敗した後,子プロセスは実行し続けます。その後の _exitの呼び出しで子プロセスを終了します。 OpenVMS の実装では,呼び出しの実行に失敗した後,チャイルド・コンテキストは終了します。その後の _exit の呼び出しで,親プロセスを終了します。この C RTL の修正は,機能論理スイッチ DECC$EXIT_AFTER_FAILED_EXEC により有効になります。この機能論理スイッチを有効にすると,チャイルド・コンテキストが実行し続けます。
DECC$EXIT_AFTER_FAILED_EXEC が無効か定義されていない場合は,現在の動作がデフォルトで残ります。
注意
EXIT_SUCCESS と EXIT_FAILURE はどの ANSI C コンパイラ間でも移植可能であり,それぞれ正常終了と異常終了を示します。 OpenVMS システムでは,OpenVMS の条件コードに変換され,重大度がそれぞれ正常終了または異常終了に設定されます。子プロセスでは,親プロセスに渡すデータの量を少なくするために, 3〜255 の範囲の値を使用できます。親は wait, wait3, wait4, waitpid関数を使用してこのデータを取得します。
目次 | 索引 |
|