fcntl (BPX1FCT、BPX4FCT) - オープン・ファイル記述子を制御する

関数

fcntl 呼び出し可能サービスは、オープン・ファイルの生成制御機能を実行します。これは、ファイル記述子フラグ、 ファイル状況フラグ、ロック情報、およびファイル・タグを検索したり設定したりします。 この呼び出し可能サービスは、ファイル内のテキスト・データの自動変換も制御します。

要件

操作 環境
許可: 監視プログラム状態または問題プログラム状態、任意の PSW キー
ディスパッチ可能単位モード: タスク
仮想記憶間モード: PASN = HASN
AMODE (BPX1FCT): 31 ビット
AMODE (BPX4FCT): 64 ビット
ASC モード: 1 次アドレス・スペース制御 (ASC) モード
割り込み状況: 割り込み可能
ロック: アンロック状態
制御パラメーター: すべてのパラメーターは、呼び出し元からアドレスできるようになっていなければならず、 また 1 次アドレス・スペース内に存在していなければなりません。

フォーマット

構文は以下のとおりです。

AMODE 64 の呼び出し元は BPX4FCT を使用しますが、指定するパラメーターは同じです。 ただし、AMODE 64 呼び出し元の場合、Argument パラメーターは、Action パラメーター に応じて、64 ビット・ポインターでも、4 バイト値でもかまいません。

パラメーター

File_descriptor
指定パラメーター
型:
整数
長さ:
フルワード

ファイルのファイル記述子が入るフルワードの名前です。 このパラメーターは、オープンされているファイル記述子を指定しなければなりません。 ただし、Action パラメーターが F_CLOSFD になっている場合は例外です。 この場合は、ファイル記述子が使用されていないと想定されます。

処置
指定パラメーター
型:
構造体
長さ:
フルワード

BPXYFCTL マクロでマップされる整数値が 1 つ入っているフルワードの名前であり、実行するアクションを示します。 アクションのリストについては、BPXYFCTL - fcntl のコマンド値およびフラグを参照してください。

引数
指定および戻りパラメーター
型:
構造体
長さ:
フルワード (ダブルワード)
引数またはゼロが入っているフルワード (ダブルワード) の名前です。引数のタイプは、必要とされる以下のアクションによって決まります。
処置
引数
F_CLOSFD
File_descriptor_2
F_CONTROL_CVT
fcntl 変換 (F_CVT) 構造
F_DUPFD
File_descriptor_2
F_DUPFD2
File_descriptor_2
F_GETFD
0
F_GETFL
0
F_GETLK
Lock_information
F_GETOWN
0
F_SETFD
File_descriptor_flags
F_SETFL
File_status_flags
F_SETLK
Lock_information
F_SETLKW
Lock_information
F_SETOWN
Pid
F_SETTAG
File_Tag

F_SETLK、F_GETLK、F_SETLKW、F_SETTAG、または F_CONTROL_CVT を使用する AMODE 64 呼び出し元の場合、Argument は 64 ビット・ポインターです。 F_SETLK、F_GETLK、F_SETLKW、F_SETTAG、または F_CONTROL_CVT を使用する AMODE 31 呼び出し元の場合、Argument は 31 ビット・ポインターです。

引数オプション
引数として使用できるオプションは、以下のとおりです。
File_descriptor_2
ファイル記述子が入るフルワードの名前です。

Action が F_DUPFD ならば、fcntl は、 オープン・ファイルに既に関連のない File_descriptor_2 と同等かそれよりも大きい、 最も低いファイル記述子を戻します。 File_descriptor は複製されます。

Action が F_DUPFD2 ならば、戻されるファイル記述子は、File_descriptor_2 と同等です。 File_descriptor_2 は、それが既に使用中であれば、クローズされます。 F_CLOEXEC はクリアされます。

File_descriptor は複製されます。 File_descriptor が File_descriptor_2 と同等であると、F_DUPFD2 アクションは、File_descriptor_2 クローズしないで戻します。 F_CLOEXEC はクリアされません。

Action が F_CLOSFD であれば、File_descriptor_2 は、 クローズするファイル記述子の範囲に上限を指定し、 File_descriptor は下限を指定します。 -1 が File_descriptor_2 に指定されていると、下限よりも大きいか等しいファイル記述子はすべてクローズされます。

File_descriptor_flags
ファイル記述子フラグが入るフルワードの名前です。 このフラグは、File_descriptor 用に設定または検索されます。

File_descriptor_flags を取得するには、アクション F_GETFD を指定します。 アクションが成功すると、Return_value は、File_descriptor_flags のビット設定にマップされます。

同様に File_descriptor_flags を設定するには、 アクション F_SETFD を指定して、File_descriptor_flags を必要な値に設定またはリセットするマッピングを使用します。
注: FCTLCLOFORK フラグをオンに設定した後、オフに再設定することはできません。

ファイル記述子フラグは、BPXYFCTL マクロによりマップされます。BPXYFCTL - fcntl のコマンド値およびフラグを参照してください。

File_status_flags
ファイル状況フラグが入るフルワードの名前です。 このフラグは、File_descriptor 用に設定または検索されます。

File_status_flags を取得するには、アクション F_GETFL を指定します。 アクションが成功すると、Return_value は、File_status_flags のビット設定にマップされます。

同様に File_status_flags を設定するには、 アクション F_SETFL を指定して、File_status_flags を必要な値に設定またはリセットするマッピングを使用します。 Action が F_SETFL のときに設定されるのは、O_ASYNCSIG、 O_APPEND、 O_NONBLOCK および O_SYNC フラグのみです。 指定されているその他のどんなフラグも無視されます。

ファイル状況フラグを使用して、BPXYOPNF マクロによりマップされるオープン・フラグの幾つかを設定します。 ファイル状況フラグのマッピングについては、BPXYOPNF - open のフラグ値をマップする を参照してください。

F_GETFL 要求からの戻り値と一緒に 2 つのマスクが使用できます。 O_ACCMODE マスクを使用すると、戻り値からファイル・アクセス・モード・フラグを抽出できます。 また、O_GETFL マスクを使用すると、ファイル・アクセス・モード・フラグと ファイル状況フラグの両方を抽出できます。

Lock_information
構造体に対するポインターが入るフルワード (ダブルワード) の名前です。この構造体は、ロックが設定、クリア、または照会されるファイル・セグメントに関する情報を持っています。
Lock_information は、以下のように BPXYBRLK マクロによりマップされます。
ワード 説明
0 l_type: 0-1 バイトには、設定、クリア、または照会されるロックのタイプを 指定します。詳しくは、『使用上の注意』の『ファイル・ロック』を参照してください。
0 l_whence: 2-3 バイトには、ロック・オフセットの決定方法を指定します。 詳しくは、『使用上の注意』の『ファイル・ロック』を参照してください。
1–2 l_start には、設定、クリア、または照会されるロックの開始バイト・オフセットを指定します。 これは、ダブルワード値です。
3–4 l_len には、設定、クリア、または照会されるバイト範囲の長さを指定します。 これは、ダブルワード値です。
5 l_pid: F_GETLK 要求からの戻り時に、 ブロッキング・ロックを保持しているプロセスのプロセス ID が検出された場合、 それがこのフィールドに入っています。
詳しくは、『使用上の注意』の『ファイル・ロック』を参照してください。
Pid
File_descriptor に関連したソケットの SIGIO または SIGURG シグナルを受け取るプロセス ID またはプロセス・グループ ID が入る フルワードの名前です。

すべてのソケットには、関連したプロセス・グループ番号が付いていて、番号はゼロに初期設定されています。 これを設定するには、fcntl サービスを呼び出して、F_SETOWN アクションを指定します。 この値は、w_ioctl 呼び出し可能サービスを使用して設定することもできます。 F_SETOWNArgument 値は、 プロセス ID を指定する場合は正の整数を取り、 プロセス・グループ ID を指定する場合は負の整数 (-1 は除く) を取ることができます。 F_GETOWN コマンドは、ソケットに関連したプロセス ID またはプロセス・グループ ID を戻り値に戻します。 プロセス ID の指定とグループ ID の指定の違いは、 前者の場合は、単一プロセスだけがシグナルを受け取るのに対して、 後者の場合は、プロセス・グループ内のすべてのプロセスがシグナルを受け取るという点です。 F_SETOWN および F_GETOWN アクションは、AF_INET ストリーム・ソケットでのみ使用可能です。

File_Tag
ファイル・タグを指すポインターが入るフルワード ( ダブルワード) の名前です。このファイル・タグは 、BPXYSTAT (BPXYSTAT - stat の応答構造体をマップする) 内でマップされます。

Action が F_SETTAG の場合、fcntl サービスはファイル用ファイル・タグ属性を 設定します。そのファイルは、通常、FIFO、またはキャラクター型スペシャル・ファイルである必 要があり、書き込みモードで開かなければなりません。 ファイルは空でなければなりません。 ファイルが空でなく、DeferTag ビットが設定されていると、コマンドが作動済みと 仮定されて、エラーは戻されず、処理も発生しません。これによって、呼び出し元は ファイル・サイズのチェックなしに F_SETTAG を発行できるようになります。 ただし、エラーにはなりません。 既にタグが付けられていて、開かれたタグを設定するために F_SETTAG を使用すると、O_TRUNC は無視されます。

DeferTag ビットがオフの場合、ファイル・タグは即時に設定されます。 DeferTag ビットがオンの場合、ファイル・タグの設定は、BPX1WRT (BPX4WRT) への呼び出しにより 最初の書き込みが行われるまで据え置かれます。書き込みが何も行われず、 そのファイルがクローズされると、ファイル・タグが脱落します。書き込み障害が 発生した場合、ファイルのタグ付けが発生する場合と発生しない場合があります。 ファイルが FIFO ファイルまたはパイプ・ファイルの場合、ファイル・タグの設定は、最初の読 み取り (BPX1RED/BPX4RED) または最初の書き込み (BPX1WRT/BPX4WRT) (どちらか先に 行われる方) が行われるまで据え置かれます。 これは、ブロック化が使用可能になっている場合、空のファイルに対しても読み取りが書 き込みより先に実行できるからです。

このファイルが /dev/null/dev/random/dev/urandom、 または /dev/zero の場合、ファイル・タグはディスクに書き込まれません。

推奨: ファイルの最初の書き込みの前にタグ設定を据え置いたまま F_SETTAG を複数回使用することは、推奨できません。F_SETTAG のタグ設定据え置きを引き起こす可能性がある C-RTL 環境オプションがあることにご注意ください (FILETAG(,AUTOTAG) など)。
fcntl 変換構造
このファイルに対する変換の仕方を記述している 2 ワードの名前。 この 2 ワード構造は BPXYFCTL (BPXYFCTL - fcntl のコマンド値およびフラグの F_CVT を参照) 内で マップされます。最初のワードには可能性のある 4 つのサブコマンドの 1 つがあり、 その後に 2 バイトのプログラム CCSID および 2 バイトのファイル CCSID が続きます。

Action が F_CONTROL_CVT の場合、fcntl サービスは、オープンされたファイルが 読み込み (BPX1RED または BPX4RED 経由) 時または書き出し (BPX1WRT または BPX4WRT 経由) 時の 発生する変換の仕方を制御します。そのファイルは、通常、FIFO、またはキャラクター型スペシャル・ファイルである 必要があります。

サブコマンドは、以下のとおりです。
サブコマンド
説明
SetCvtAll
SetCvtOn と同じように動作します。ただし、自動変換は ALL に設定され、UNICODE 変換が有効になります。ThliCcsid は使用されません。ファイルの I/O が既に開始されている場合、SetCvtAll は無視されます。スレッドは、オープン・ファイルごとに 異なるプログラム CCSID を設定することができます。ただし、同じオープン・ファイルを 共用する 2 つのスレッドがそのファイルに対して異なるプログラム CCSID を 持っている場合は入出力エラーが発生します。
SetCvtOff
有効となる可能性があるすべての変換をオフにします。CCSID 値は 無視されます。自動変換が ALL に設定されていて、そのファイルの I/O が既に開始されている場合、このコマンドは無視されます。
SetCvtOn
ストリームに対する自動変換をオンにして、オプションで プログラム CCSID、ファイル CCSID、またはその両方を設定します。プログラム CCSID 用の 16 進数値 0 は、 各読み取りまたは書き込み時に現行のプログラム CCSID を使用することを 示します。現行のプログラム CCSID の初期値は 1047 ですが、プログラムによって直接リセットすることも、適切なランタイム・オプション または環境変数を設定して間接的にリセットすることもできます。

ファイル CCSID 用の 16 進数値 0 は、現行の設定値が変更されない ことを示します。この値は、格納するファイル・タグまたはプログラム CCSID に影響しません。 この値はこのデータ・ストリーム上で変換を制御するのに使用される値を 変更するだけです。

ThliCcsid の設定または参照は 依然として有効ですが、推奨されません。

SetAutoCvtAll
変換が環境に対して有効になっている (BPXPRMxx parmlib ステートメント AUTOCVT 設定値 ALL または適切な環境変数の使用による) 場合、 このサブコマンドは SetCvtAll と同じように動作します。そうでない場合は、このサブコマンドによる影響はありません。
SetAutoCvtOn
変換が環境 (BPXPRMxx の AUTOCVT、または適切な環境変数を使用して) で使用可能な場合、このサブコマンドは SetCvtOn と 同様に機能します。そうでない場合は、このサブコマンドによる影響はありません。
QueryCvt
変換が有効かどうか、および使用されている プログラムとファイルの CCSID を返します。入力では、 サブコマンドは QueryCvt です。出力では、サブコマンドは SetCvtOn、SetCvtAll、または SetCvtOff (それぞれ変換が ON、ALL、OFF であることを示す) にリセットされます。現行の CCSID は 、F_CVT 構造にある CCSID のそれぞれの位置に戻されます。
Return_value
戻りパラメーター
型:
整数
長さ:
フルワード
要求が成功した場合に 0、要求が成功しなかった場合に -1 を、fcntl サービスが戻すフルワードの名前です。以下のテーブルは、指定されたアクションごとに Return_value で取り得る値をリストしています。
処置 引数 Return_value
F_CLOSFD File_descriptor_2 0
F_CONTROL_CVT F_CVT 0
F_DUPFD File_descriptor_2 File_descriptor
F_DUPFD2 File_descriptor_2 File_descriptor
F_GETFD 0 File_descriptor_flags
F_GETFL 0 File_status_flags
F_GETLK Lock_information Lock_information
F_GETOWN 0 Pid
F_SETFD File_descriptor_flags 0
F_SETFL File_status_flags 0
F_SETLK Lock_information 0
F_SETLKW Lock_information 0
F_SETOWN Pid 0
F_SETTAG File_Tag 0
Return_code
戻りパラメーター
型:
整数
長さ:
フルワード
fcntl サービスが戻りコードを保管するフルワードの名前です。 fcntl サービスは、Return_value が -1 の場合に限り、Return_code を戻します。考えられる戻りコード値の完全なリストについては、 「z/OS UNIX System Services メッセージおよびコード」を参照してください。 fcntl サービスは、Return_code パラメーターに以下の値のいずれかを戻します。
Return_code 説明
EAGAIN 呼び出しプロセスが、ロックの設定を依頼しましたが、 このロックは、 別のプロセスによって既に設定されているファイルの重複部分のロックと競合しています。
EBADF 以下の理由のいずれかが原因で、要求は受け入れられませんでした。
  • File_descriptor パラメーターに、有効なオープン・ファイル記述子が指定されていません。
  • 読み取りロックを設定する要求が実行されましたが、ファイルは、書き込み専用でオープンされています。
  • 書き込みロックを設定する要求が実行されましたが、ファイルは、読み取り専用でオープンされています。
  • File_descriptor が opendir 要求によりオープンされました。 他の要求の多くは、opendir filedes に対してリジェクトされます。
  • 要求されたアクションが F_DUPFD2 であれば、 このエラーは、File_descriptor_2 が負の値であったか、 プロセスで許可されているファイル記述子の最大値と等しいかそれよりも大であったことを示します。 システムにファイル記述子の最大値を指定するには、MAXFILEPROC parmlib オプションを使用します。

戻りコードに、JRFdTooBig という理由コードが伴う場合があります。

EDEADLK 要求されたアクションが F_SETLKW で、デッドロックの可能性があることが分かりました。
EINTR F_SETLKW 要求を処理中に、fcntl にシグナルによる割り込みが入りました。
EINVAL 以下の理由のいずれかが原因で、要求は受け入れられませんでした。
  • 要求されたアクションが F_DUPFD であった場合、 File_descriptor_2 が負の値であったか、 プロセスで許可されているファイル記述子の最大値と等しいかそれよりも大でした。 システムにファイル記述子の最大値を指定するには、MAXFILEPROC parmlib オプションを使用します。
  • 要求されたアクションが F_SETLK または F_SETLKW であった場合、File_descriptor により指定されたファイルが ロックをサポートしていないか、Lock_information パラメーターに誤った値が入っています。
  • 指定されたアクションが F_CLOSFD であり、File_descriptor_2 により指定されたファイル記述子が File_descriptor よりも 小 (ただし、-1 ではない) でした。
  • 要求されたアクションが F_SETTAG または F_CONTROL_CVT であり、 誤りの入力データが提供されたか、またはファイルがこの使用目的には不適切でした。
  • 誤ったアクションが渡されました。

戻りコードに、JRFdTooBig、JRFd2TooSmall、 JrBrlmBadFileType、JrBrlmBadL_Type、JrBrlmInvalidRange、 JrBrlmBadL_Whence、JrNotsupportedForFileType、 JrBadInputBufAddr、JrFileNotEmpty、JrWFildeRdOnly、 JrInvalidFileTag、JrInvalidCcsid、JrBadOptCode という理由コードが伴う場合があります。

EMFILE 要求されたアクションは F_DUPFD でした。 プロセスが、既にファイル記述子の最大数に達しているか、File_descriptor_2 よりも大きい 使用可能なファイル記述子がありません。
ENOTSOCK Socket_descriptor が有効なソケット記述子を参照していません。 戻りコードに、JRMustBeSocket という理由コードが伴う場合があります。
EPERM 要求されたアクションが F_CLOSFD であり、 指定された範囲内のファイル記述子の少なくとも 1 つがオープンしています。 F_CLOSFD を使用してクローズできないファイル記述子についての説明は、 『使用上の注意』を参照してください。
Reason_code
戻りパラメーター
型:
整数
長さ:
フルワード

fcntl サービスが理由コードを保管するフルワードの名前です。 fcntl サービスは、Return_value が -1 の場合に限り、Reason_code を戻します。 Reason_code は Return_code 値をさらに限定します。理由コードについては、「z/OS UNIX System Services メッセージおよびコード」を参照してください。

使用上の注意

ファイルのクローズ
  • プロセスは、fcntl サービスを使用して、ファイル記述子の範囲をクローズすることができます。 File_descriptor_2 は、File_descriptor 以上でなければならず、 または 1 にすることができます。 -1 は、File_descriptor 以上のファイル記述子がすべてクローズされることを示します。
  • F_CLOSFD の使用は、close サービス (BPX1CLO、BPX4CLO) の使用と一致するようにな っています。 close サービスを使用してもクローズできなかったファイル記述子は、クローズできません。
  • ファイル記述子をクローズできない場合は、エラーと見なされますが、 要求は、その範囲内の次のファイル記述子を使用して続行されます。 使用中でないファイル記述子は、無視されます。
ファイルのロック
  • プロセスは、fcntl サービスを使用して、 ファイルの一部から他の連携プロセスをロックアウトするので、 このプロセスは、他からの妨害を受けずに、ファイルの該当する部分に対して、 読み取りおよび書き込みを行うことができます。これにより、 複数のプロセスが 1 つのファイルに並行してアクセスする場合の データ保全性が保証されます。
  • ファイル・ロックは、通常のファイルを参照するファイル記述子においてのみ実行することができます。 ディレクトリー、FIFO ファイル、パイプ、キャラクター型スペシャル・ファイル、その他のタイプの ファイルを参照するファイル記述子にロックは許可されません。
  • ロック操作は、BPXYBRLK によりマップされた構造体で制御されます。 このフォーマットは、パラメーターに記述しています。この構造体は、要求が、ロックの設定、ロックの解放、 またはロックの特定バイト範囲の照会のいずれであっても必要です。 以下に BPXYBRLK 構造体の詳細記述を示します。
  • l_type フィールドを使用して、設定、クリア、または照会されるロックのタイプを指定します。 l_type で有効な値は、以下のとおりです。
    タイプ
    説明
    F_RDLCK
    読み取りロック。 ハーフワードの整数値 1 を指定します。これは、共用ロック とも呼ばれます。 このタイプのロックは、プロセスがファイルのロック部分を読み取ることができ、 その読み取り中に、他のプロセスからは、そのファイルの当該部分への書き込みができないように指定します。 プロセスは、保持されている書き込みロックまたはその任意の一部を読み取りロックに変更でき、 それにより、その部分が他のプロセスから読み取り可能になります。 マルチプロセスでは、ファイルの同じ部分を同時に読み取りロックにすることができます。 読み取りロックを確立するためには、プロセスには、読み取り用にアクセスされるファイルが存在する必要があります。
    F_WRLCK
    書き込みロック。 ハーフワードの整数値 2 を指定します。 これは、排他ロック とも呼ばれます。 このタイプのロックは、他のプロセスからの干渉なしに、 プロセスがファイルのロック部分に書き込み可能であることを示しています。 あるプロセスがファイルの一部に書き込みロックを設定すると、 他のプロセスは、そのファイルの同じ部分に読み取りロックも書き込みロックも設定できません。 ファイルの重複する部分に既に読み取りロックが設定されていると、 プロセスがその重複する読み取りロックの唯一の所有者でない限り、 プロセスは、ファイルのその部分に書き込みロックを設定することはできません。 このような場合、重複する部分の読み取りロックは、 要求されている書き込みロックにより置き換えられます。 書き込みロックを設定するには、 プロセスが、そのファイルに書き込みアクセスできるようにしておかなければなりません。
    F_UNLCK
    ロック解除を示します。 ハーフワードの整数値 3 と指定します。 これは、要求しているプロセスが指定する範囲に保持されているすべてのロックを解除するのに使用されます。
  • fcntl サービスの l_whence および l_start フィールドを使用すると、 lseek サービス (BPX1LSK、BPX4LSK) の処理が並列化されます。詳しくは、lseek (BPX1LSK、BPX4LSK) - ファイルのオフセットを変更するを参照してください。
  • l_whence フィールドは、ファイル内でのバイト範囲オフセットの検出方法を指定するのに使用されます。 l_whence で有効な値は、以下のとおりです。
    説明
    SEEK_SET
    ファイルの開始位置を表し、ハーフワード整数値 0 が指定されます。
    SEEK_CUR
    ファイルの現行ファイル・オフセットを表し、ハーフワード整数値 1 が指定されます。
    SEEK_END
    ファイルの終了位置を表し、ハーフワード整数値 2 が指定されます。
  • l_start フィールドは、ロック、ロック解除、または照会されるファイルの一部を識別するのに使用されます。 ロックにより影響を受けるファイルの一部は、 l_whence フィールドが指定する位置のこのオフセットから始まります。 例えば、l_whence が SEEK_CUR であって、l_start の値が 10 の場合、 F_SETLK 要求は、現行カーソル位置の 10 バイト先から、 ロックを設定しようとします。 l_start 値が l_whence 位置の示すオフセットに追加されると、l_start 値は負となることがあります。 その結果、オフセットがファイルの開始位置を超えて拡張されなくなります。
    注: ユーザーはファイルの開始位置を超えて開始または拡張されるバイト範囲を要求することはできませんが、 ファイルの終了位置を超えて開始または拡張されるバイト範囲は要求できます。
  • l_len field は、ファイルのロック部分のサイズをバイト単位で指定するのに使用されます。 l_len に指定された値が負となることがあります。 l_len が正の場合、 影響を受ける領域は、l_start から l_start+l_len-1 までです。 l_len が負の場合、影響を受ける領域は、l_start+l_len から l_start-1 までです。l_len がゼロであると、 ファイルのロック部分は、l_whence および l_start で指定される位置から始まり、 ファイルの終わりまで拡張されます。
  • l_pid フィールドは、F_GETLK 要求で検出されたロックを保持しているプロセスのプロセス ID が検出された場合、 それを識別します。
ロックの取得
  • ユーザーは BPX1FCT (BPX4FCT) サービスに Action パラメーターとして F_SETLK を指定すれば、 ロックを設定できます。ロックを取得できないと、Return_value -1 が、所要の Return_code および Reason_code と一緒に戻されます。 l_type を F_UNLCK に設定して、既に保持されているロックを解放するには、 F_SETLK を使用することもできます。
  • BPX1FCT (BPX4FCT) サービスに Action パラメーターとして F_SETLKW を指定することにより、 ロックを設定することもできます。要求された範囲の全体またはその一部に、別のプロセスでロックが設定されているために、 ロックが取得できない場合、F_SETLKW 要求を出して、指定された範囲が解放されるまで待機し、 要求を完了することができます。 l_type を F_UNLCK に設定して F_SETLKW を使用すれば、 既に保持されているロックを解放することもできます。
  • F_SETLKW 操作で待機中に、fcntl サービスへの呼び出しをシグナルが中断した場合、 このサービスは、Return_value -1 および Return_code、EINTR を一緒に戻します。
  • F_SETLKW 操作は、デッドロックを検出できます。 デッドロックは、 プロセス A が、プロセス B により領域のロックが解除されるのを待っていて、 プロセス B も、プロセス A により別の領域のロックが解除されるのを待っている場合に発生します。 F_SETLKW によりデッドロックが引き起こされる可能性があることを、システムが検出すると、 fcntl サービスは、Return_value -1 および Return_code、 EDEADLK を戻します。
ロック状況の判別
  • プロセスは、fcntl サービスの Action パラメーターとして F_GETLK を使用して、 ファイルに関するロック情報を判別できます。この場合、Argument に、 BPXYBRLK マクロによりマップされる構造体へのポインターを指定する必要があります。 この構造体には、 呼び出し元が実行したいロック操作について記述しておく必要があります。 fcntl サービスが戻されたとき、構造体は変更され、 検出された最初のロックにより、 提示されたロック操作が正常終了できなくなることが記述されています。
  • 提示されたロックを設定できないようにするロックが検出されると、F_GETLK 要求は、 以下のように変更された構造体を戻します。
    • l_whence 値は常に SEEK_SET。
    • l_start 値はファイルの先頭から始まるロック部分のオフセットを指定している。
    • l_len 値はファイルのロック部分の長さに設定されている。
    • l_pid 値はロックを保持しているプロセスのプロセス ID に設定されている。

    指定されたロック操作が正常終了できないようにするロックが存在しない場合、 戻される構造体は、F_UNLCK の l_type を持つように変更されていますが、 そうでない場合は未変更のままです。

複数ロック要求
  • 1 つのプロセスで、1 つのファイルに複数のロックを同時に設定できますが、 指定されたいかなるバイトにも、1 つのタイプのロックしか設定できません。 プロセスが、既にロック済みのファイルの一部に新規ロックを設定すると、 プロセスは、ファイルの当該部分に 1 つのロックしか設定しません。 そのロック・タイプは、最新のロック操作により指定されたものです。
ロックの解除
  • F_SETLK または F_SETLKW 要求が実行され、 ファイルのバイト領域のロックが解除されると、 指定された領域内のプロセスにより保持されているロックはすべて解放されます。 つまり、ロック解除要求に指定されている各バイトは、 要求プロセスによりそのバイトに対して保持されているいかなるロックからも解放されます。
  • プロセスが、ファイルのファイル記述子をクローズすると、 そのファイルに関するプロセスのロックはすべて除去されます。 ロックは、fork サービスで作成される子プロセスにより継承されません。 fork サービスについての詳細は、fork (BPX1FRK、BPX4FRK) - 新規プロセスを作成するを参照してください。
注: すべてのロックは、通知するだけです。プロセスは、ファイルの部分を保護したいということを互いに通知し合うのに ロックを使用することができますが、ロックはロックされた部分での I/O を妨 げることはありません。ファイルに適切な許可のあるプロセスは、設定されているロックの種類に関係なく、 プロセスが選択する任意の入出力を実行することができます。 したがって、 ファイル・ロックは規則でしかなく、 すべてのプロセスがその規則を順守している場合にのみ機能します。

関連サービス

特性と制限

fcntl サービスの使用に関する制約事項はありません。

この呼び出し可能サービスを使用した例については、BPX1FCT (fcntl) の例を参照してください。