fcntl — fcntlおよびioctlシステムコール
このモジュールは、ファイル記述子に対してファイル制御とI / O制御を実行します。 これは、fcntl()
およびioctl()
Unixルーチンへのインターフェースです。 これらの呼び出しの詳細については、 fcntl(2)および ioctl(2) Unixのマニュアルページを参照してください。
このモジュールのすべての関数は、最初の引数としてファイル記述子 fd を取ります。 これは、sys.stdin.fileno()
によって返されるような整数ファイル記述子、または fileno(を提供するsys.stdin
自体などの io.IOBase オブジェクトにすることができます。 )は、本物のファイル記述子を返します。
バージョン3.8で変更: fcntlモジュールには、 os.memfd_create()[のシーリング用のF_ADD_SEALS
、F_GET_SEALS
、およびF_SEAL_*
定数が含まれるようになりました。 X145X]ファイル記述子。
このモジュールは、次の機能を定義します。
- fcntl.fcntl(fd, cmd, arg=0)
ファイル記述子 fd に対して操作 cmd を実行します( fileno()メソッドを提供するファイルオブジェクトも受け入れられます)。 cmd に使用される値はオペレーティングシステムに依存し、関連するCヘッダーファイルで使用されているのと同じ名前を使用して、 fcntl モジュールで定数として使用できます。 引数 arg は、整数値または bytes オブジェクトのいずれかです。 整数値の場合、この関数の戻り値はC
fcntl()
呼び出しの整数戻り値です。 引数がバイトの場合、それはバイナリ構造を表します。 struct.pack()によって作成されました。 バイナリデータは、アドレスがCfcntl()
呼び出しに渡されるバッファにコピーされます。 呼び出しが成功した後の戻り値は、 bytes オブジェクトに変換されたバッファーの内容です。 返されるオブジェクトの長さは、 arg 引数の長さと同じになります。 これは1024バイトに制限されています。 オペレーティングシステムによってバッファに返される情報が1024バイトより大きい場合、セグメンテーション違反またはより微妙なデータ破損が発生する可能性があります。fcntl()
が失敗すると、 OSError が発生します。
- fcntl.ioctl(fd, request, arg=0, mutate_flag=True)
この関数は、 fcntl()関数と同じですが、引数の処理がさらに複雑になる点が異なります。
request パラメーターは、32ビットに収まる値に制限されています。 request 引数として使用するための追加の定数は、関連するCヘッダーファイルで使用されているのと同じ名前で、 termios モジュールにあります。
パラメータ arg は、整数、読み取り専用バッファインターフェイスをサポートするオブジェクト( bytes など)、または読み取り/書き込みバッファインターフェイスをサポートするオブジェクト(など)のいずれかです。 bytearray )。
最後の場合を除いて、動作は fcntl()関数の場合と同じです。
可変バッファーが渡された場合、動作は mutate_flag パラメーターの値によって決定されます。
falseの場合、バッファの可変性は無視され、動作は読み取り専用バッファと同じですが、上記の1024バイトの制限が回避される点が異なります。ただし、渡すバッファが少なくともオペレーティングシステムが必要とする長さである場合に限ります。そこに置くために、物事はうまくいくはずです。
mutate_flag がtrue(デフォルト)の場合、バッファーは(事実上)基になる ioctl()システムコールに渡され、後者の戻りコードは呼び出し元のPythonに返されます。 、およびバッファの新しい内容は、 ioctl()のアクションを反映しています。 提供されたバッファの長さが1024バイト未満の場合、最初に1024バイトの静的バッファにコピーされ、次に ioctl()に渡されて、提供されたバッファにコピーされます。
ioctl()
が失敗すると、 OSError 例外が発生します。例:
>>> 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, operation)
ファイル記述子 fd に対してロック操作操作を実行します( fileno()メソッドを提供するファイルオブジェクトも受け入れられます)。 詳細については、Unixのマニュアル flock(2)を参照してください。 (一部のシステムでは、この関数は
fcntl()
を使用してエミュレートされます。)flock()
が失敗すると、 OSError 例外が発生します。
- fcntl.lockf(fd, cmd, len=0, start=0, whence=0)
これは基本的に、 fcntl()ロック呼び出しのラッパーです。 fd は、ロックまたはロック解除するファイルのファイル記述子( fileno()メソッドを提供するファイルオブジェクトも受け入れられます)であり、 cmd は次のいずれかです。次の値:
LOCK_UN
–ロック解除LOCK_SH
–共有ロックを取得しますLOCK_EX
–排他ロックを取得します
cmd が
LOCK_SH
またはLOCK_EX
の場合、ロック取得時のブロックを回避するためにLOCK_NB
とビット単位でORすることもできます。LOCK_NB
が使用され、ロックを取得できない場合、 OSError が発生し、例外の errno 属性がEACCES
またはEAGAIN
(オペレーティングシステムによって異なります。移植性については、両方の値を確認してください)。 少なくとも一部のシステムでは、LOCK_EX
は、ファイル記述子が書き込み用に開かれたファイルを参照している場合にのみ使用できます。len はロックするバイト数、 start は、 whence 、および whence を基準にした、ロックが開始するバイトオフセットです。 io.IOBase.seek()と同じです。具体的には、次のとおりです。
0
–ファイルの先頭を基準にしています( os.SEEK_SET )1
–現在のバッファー位置を基準にしています( os.SEEK_CUR )2
–ファイルの終わりを基準に( os.SEEK_END )
start のデフォルトは0です。これは、ファイルの先頭から開始することを意味します。 len のデフォルトは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番目の例では、 bytes オブジェクトを保持します。 lockdata 変数の構造レイアウトはシステムに依存するため、 flock()呼び出しを使用する方が適切な場合があります。