36.10. fcntl — fcntlおよびioctlシステムコール—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/fcntl
移動先:案内検索

36.10。 fcntl - NSfcntl とioctlシステムコール

このモジュールは、ファイル記述子に対してファイル制御とI / O制御を実行します。 これは、fcntl()およびioctl() Unixルーチンへのインターフェースです。 これらの呼び出しの詳細については、 fcntl(2)および ioctl(2) Unixのマニュアルページを参照してください。

このモジュールのすべての関数は、最初の引数としてファイル記述子 fd を取ります。 これは、sys.stdin.fileno()によって返されるような整数のファイル記述子、または本物を返す fileno()を提供するsys.stdin自体などのファイルオブジェクトにすることができます。ファイル記述子。

このモジュールは、次の機能を定義します。

fcntl.fcntl(fd, op[, arg])

ファイル記述子 fd に対して操作 op を実行します( fileno()メソッドを提供するファイルオブジェクトも受け入れられます)。 op に使用される値はオペレーティングシステムに依存し、関連するCヘッダーファイルで使用されているのと同じ名前を使用して、 fcntl モジュールで定数として使用できます。 引数 arg はオプションであり、デフォルトは整数値0です。 存在する場合は、整数値または文字列のいずれかです。 引数がないか整数値の場合、この関数の戻り値はC fcntl()呼び出しの整数戻り値になります。 引数が文字列の場合、それはバイナリ構造を表します。 struct.pack()によって作成されました。 バイナリデータは、アドレスがC fcntl()呼び出しに渡されるバッファにコピーされます。 呼び出しが成功した後の戻り値は、文字列オブジェクトに変換されたバッファの内容です。 返される文字列の長さは、 arg 引数の長さと同じになります。 これは1024バイトに制限されています。 オペレーティングシステムによってバッファに返される情報が1024バイトより大きい場合、セグメンテーション違反またはより微妙なデータ破損が発生する可能性があります。

fcntl()が失敗すると、IOErrorが発生します。

fcntl.ioctl(fd, op[, arg[, mutate_flag]])

この関数は fcntl()関数と同じですが、操作は通常ライブラリモジュール termios で定義され、引数の処理がさらに複雑になる点が異なります。

opパラメータは、32ビットに収まる値に制限されています。 op 引数として使用するための追加の定数は、関連するCヘッダーファイルで使用されているのと同じ名前で、 termios モジュールにあります。

パラメータ arg は、整数、不在(整数0と同じように扱われる)、読み取り専用バッファインターフェイスをサポートするオブジェクト(ほとんどの場合、プレーンなPython文字列)、または読み取り/書き込みバッファインターフェイスをサポートするオブジェクト。

最後の場合を除いて、動作は fcntl()関数の場合と同じです。

可変バッファーが渡された場合、動作は mutate_flag パラメーターの値によって決定されます。

falseの場合、バッファの可変性は無視され、動作は読み取り専用バッファと同じですが、上記の1024バイトの制限が回避される点が異なります。ただし、渡すバッファがオペレーティングシステムが必要とする長さ以上である場合に限ります。そこに置くために、物事はうまくいくはずです。

mutate_flag がtrueの場合、バッファーは(事実上)基になる ioctl()システムコールに渡され、後者の戻りコードは呼び出し元のPythonに返され、バッファーの新しいコンテンツは、 ioctl()のアクションを反映しています。 提供されたバッファの長さが1024バイト未満の場合、最初に1024バイトの静的バッファにコピーされ、次に ioctl()に渡されて、提供されたバッファにコピーされます。

mutate_flag が指定されていない場合、Python 2.5からデフォルトでtrueになります。これは、バージョン2.3および2.4からの変更点です。 バージョンの移植性が優先される場合は、引数を明示的に指定してください。

ioctl()が失敗すると、IOError例外が発生します。

例:

>>> import array, fcntl, struct, termios, os
>>> os.getpgrp()
13341
>>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, "  "))[0]
13341
>>> buf = array.array('h', [0])
>>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1)
0
>>> buf
array('h', [13341])
fcntl.flock(fd, op)

ファイル記述子 fd に対してロック操作 op を実行します( fileno()メソッドを提供するファイルオブジェクトも受け入れられます)。 詳細については、Unixのマニュアル flock(2)を参照してください。 (一部のシステムでは、この関数はfcntl()を使用してエミュレートされます。)

flock()が失敗すると、IOError例外が発生します。

fcntl.lockf(fd, operation[, length[, start[, whence]]])

これは基本的に、 fcntl()ロック呼び出しのラッパーです。 fd は、ロックまたはロック解除するファイルのファイル記述子であり、 operation は次のいずれかの値です。

  • LOCK_UN –ロック解除

  • LOCK_SH –共有ロックを取得します

  • LOCK_EX –排他ロックを取得します

演算LOCK_SHまたはLOCK_EXの場合、ロック取得時のブロックを回避するためにLOCK_NBとビットごとにORをとることもできます。 LOCK_NBが使用され、ロックを取得できない場合、IOErrorが発生し、例外の errno 属性がEACCESまたは[ X158X] (オペレーティングシステムによって異なります。移植性については、両方の値を確認してください)。 少なくとも一部のシステムでは、LOCK_EXは、ファイル記述子が書き込み用に開かれたファイルを参照している場合にのみ使用できます。

length はロックするバイト数、 start は、 whence 、および whence を基準にした、ロックが開始するバイトオフセットです。 io.IOBase.seek()と同じです。具体的には、次のとおりです。

  • 0 –ファイルの先頭を基準にしています( os.SEEK_SET

  • 1 –現在のバッファー位置を基準にしています( os.SEEK_CUR

  • 2 –ファイルの終わりを基準に( os.SEEK_END

start のデフォルトは0です。これは、ファイルの先頭から開始することを意味します。 length のデフォルトは0で、これはファイルの終わりにロックすることを意味します。 whence のデフォルトも0です。

例(すべてSVR4準拠システム上):

import struct, fcntl, os

f = open(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)

lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)

最初の例では、戻り値変数 rv が整数値を保持することに注意してください。 2番目の例では、文字列値を保持します。 lockdata 変数の構造レイアウトはシステムに依存するため、 flock()呼び出しを使用する方が適切な場合があります。

も参照してください

モジュール os
ロックフラグ O_SHLOCK および O_EXLOCKos モジュール(BSDのみ)に存在する場合、 os.open()関数 lockf()および flock()関数の代替を提供します。