Linux および AFAIK ほとんどの UNIX は、flock
ファイルロックを強制するシステムコールを公開します。もちろん、私の経験は限られていますが、リソース全体に対してカーネルによって実施されていると聞きました。しかし、特定の境界を超えない、またはロックされた領域の外部境界に達した後に読み取りを停止しない限り、そのリソースへの読み取り/書き込みを許可するようにファイルの一部だけを強制的にロックしたい場合はどうすればよいですか?可能ですか?
編集:可能な実装
要求された領域がロックを保持していない場合、メモリが各リーダーのアドレス空間にマッピングされているMMaped領域を介して部分ロックを参照する可能性が達成される可能性があります。これは完全にユーザースペースで実装されているため、カーネル強制ロックの利点を失いますが、確実に機能します。
答え1
以下を使用して部分ロックを取得できます。fcntl(2)
F_SETLK
システムコールはまたはコマンドマクロによって行われ、F_SETLKW
3番目の引数として提供される構造を介してF_GETLK
ロックされる部分領域を提供します。flock
F_SETLK
、およびは、レコードロック(バイト範囲ロック、ファイルセグメントロック、またはファイル領域ロックとも呼ばれる)が存在するかどうかを取得、解放、およびテストするために使用されますF_SETLKW
。F_GETLK
3番目のパラメータロックは、少なくとも次のフィールド(指定されていない順序)を持つ構造体へのポインタです。struct flock { ... short l_type; /* Type of lock: F_RDLCK, F_WRLCK, F_UNLCK */ short l_whence; /* How to interpret l_start: SEEK_SET, SEEK_CUR, SEEK_END */ off_t l_start; /* Starting offset for lock */ off_t l_len; /* Number of bytes to lock */ pid_t l_pid; /* PID of process blocking our lock (set by F_GETLK and F_OFD_GETLK) */ ... };
この構造のフィールド
l_whence
、l_start
およびフィールドは、l_len
ロックするバイト範囲を指定します。 ファイルの終わりの後のバイトはロックできますが、ファイルの先頭の前のバイトはロックできません。