8.10 組み込みモジュール fcntl

   

このモジュールは、ファイル記述子の指すファイルの制御、I/O 制御を行います。 これは、Unix ルーチン fcntl()ioctl() へのインターフェース です。ファイル記述子は、file オブジェクトまたは socket オブジェクトの fileno() メソッドにより取得することができます。

このモジュールには、以下の関数が定義されています。

fcntl (fd, op[, arg])
ファイル記述子 fd に対して、要求された操作を実行します。 操作は、op により定義されていて、OSに依存します。これらの操作を表す コードは、ライブラリモジュール FCNTL  から取得することができます。引数 arg はオプションで、デフォルト値は 整数の 0 です。この引数を渡す時には、整数値でも文字列でもかまいません。 この引数を指定しない場合、または整数値を指定した場合は、この関数の戻り値は C の fcntl() コールの戻り値となります。引数を文字列で指定する時は、 それはバイナリ構造であると解釈されます。(例えば、struct.pack()により 作成されるような)そしてバイナリデータはバッファにコピーされ、そのアドレスが C の fcntl() コールに渡されます。呼び出しに成功した後の戻り値は、 string オブジェクトに変換されてバッファに格納されます。fcntl() が 失敗した場合には、IOError があげられます。

ioctl (fd, op, arg)
この関数は、関数 fcntl() と同じものです。異なることは、その操作が ライブラリモジュール IOCTL に定義されていることです。

flock (fd, op)
ファイル記述子 fd に対して、ロック操作 op を実行します。 詳細については、Unix のマニュアル flock(3) を参照してください。 (いくつかのシステムでは、この関数は fcntl() を使って実現されて います。)

lockf (fd, code, [len, [start, [whence]]])
これは、FCNTL.F_SETLKFCNTL.F_SETLKW による fcntl() を上被せしたものです。詳細については、Unix のマニュアルを 参照してください。

ライブラリモジュール FCNTL  または IOCTL  が無い場合は、C のインクルード ファイル <sys/fcntl.h> または <sys/ioctl.h> の 中で操作コードを見つけることができます。また、これらモジュールは、ディレクトリ "Tools/scripts/" の中のスクリプト h2py により、自分で作成する こともできます。

例(全てのSVR4互換のシステム上)

import struct, FCNTL

file = open(...)
rv = fcntl(file.fileno(), FCNTL.O_NDELAY, 1)

lockdata = struct.pack('hhllhh', FCNTL.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl(file.fileno(), FCNTL.F_SETLKW, lockdata)

変数 rv には、最初の例では整数の戻り値が格納され、2番目の例では文字列 が格納されることに注意してください。変数 lockdata の構造のレイアウトは、 システムに依存します。従って、flock() コールを使う方がより良いと 言えます。

guido@python.org