Unix環境変数-ファイルレコードロック

最初のプロセスがファイルの特定の部分を読み取ったり変更したりする場合、レコードロックを使用すると、他のプロセスが同じファイル領域を変更できないようにすることができます。ロック操作は、fcntl関数を介して実行されます。

int fcntl(int fd、int cmd、struct flock * lock);

パラメータ:cmd:F_GETLK:既存のロックが呼び出しプロセスへの新しいロックの付与を妨げるかどうかを検出するために使用されます。そのようなロックがない場合、ロックが指すflock構造体のl_typeメンバーはF_UNLCKに設定されます。 、それ以外の場合はすでに存在しますロック情報は、ロックが指すフロック構造に書き込まれます(非アトミック操作)

                        F_SETLK:flock構造体が指すロックによって記述されたロックを取得または解放します。ロックを取得できない場合、関数はブロックせずにEACESSまたはEAGAINエラーをすぐに返します。

                        F_SETLKW:ロックの取得をブロックする

structflockの構造は次のとおりです。

struct flock {

      short l_type;    /* 锁的类型: F_RDLCK, F_WRLCK, F_UNLCK */

      short l_whence;  /* 加锁的起始位置:SEEK_SET, SEEK_CUR, SEEK_END */

      off_t l_start;  /* 加锁的起始偏移,相对于l_whence */

      off_t l_len;    /* 上锁的字节数*/

      pid_t l_pid;    /* 已经占用锁的PID(只对F_GETLK 命令有效) */

      /*...*/

};

概要:(1)同じプロセスで同じファイル間隔をロックしても、ロック許可を取得できます。

(2)プロセスが終了すると、プロセスが確立したすべてのレコードロックが解放されます。

(3)ファイル記述子が閉じられると、ファイル記述子を介してプロセスによって参照されるファイルのロックが解放されます。

(4)forkによって生成された子プロセスは、親プロセスによって設定されたロックを継承しません

(5)execを実行した、新しいプログラムは元の実行中のプログラムのロックを継承できます。

(6)書き込みロック処理と読み取りロック処理の優先度は、FIFO要求シーケンス処理によって応答されます。

 

おすすめ

転載: blog.csdn.net/Chiang2018/article/details/105418724