ファイルI/Oプログラミングfcntl関数説明_2
fcntl()関数の機能は多く、開いているファイルの性質を変えることができますが、本稿ではファイルロックの取得/設定に関する機能について説明します.fcntl()の関数プロトタイプは、int fcntl(int fd,int cmd,struct flock*lock);
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
(F_GETLK only) */
...
};
flock ,l_type , :F_RDLCK( )、F_WRLCK( )
F_UNLCK( );l_pid ;l_whence、l_start l_end
, 。 , 。l_whence SEEK_SET、
SEEK_CUR SEEK_END , 、 。l_whence l_start ,
l_start 。
:
· F_GETLK: fd 。 ,lock (
)。 , lock flock , lock flock
, PID l_pid , ; , lock flock l_type F_UNLCK,
flock , 。
· F_SETLK: (l_type F_RDLCK F_WRLCK) (l_type F_UNLCK),
, fcntl()
· F_SETLKW: F_SETLK , , , , 。
,
,F_GETLK , F_GETLK ,F_SETLK F_SETLKW ,
, , F_SETLK F_SETLKW ,
。 ,F_SETLKW 。 , ,
, 。
fcntl() , , , 。 ,
, O_NONBLOCK , , O_NONBLO
CK, ; , 。cmd F_SETFL 。
また、システム呼び出しfcntl()は、貸し出しロックにも使用できます.この場合、使用される関数のプロトタイプは次のとおりです.
int fcntl(int fd, int cmd, long arg);
cmd :F_SETLEASE F_GETLEASE。 :
プロセスによっては、ファイル上でF_SETLEASEが設定したレンタルロックが衝突すると、カーネルがこのシステム呼び出しをブロックします.また、カーネルはこのレンタルロックを持つプロセスに信号を送り、このことを通知します.このリースロックを所有するプロセスは、この信号をフィードバックし、このリースロックを削除したり、このリースロックのリース契約を短縮したりして、ファイルを他のプロセスにアクセスできるようにします.レンタルロックを持つプロセスが所定の時間内に上記の操作を完了できない場合、システムは強制的に完了します.F_経由SETLEASEコマンドargパラメータをF_に指定UNLCKではこのレンタルロックを削除できます.このリースロックに対してリースを短縮したり、削除したりする操作がプロセスが自発的であってもカーネルが強制的であっても、ブロックされたシステム呼び出しが呼び出しを発行していないプロセスがブロックを解除していない限り、システムはこのシステム呼び出しの実行を許可する.ブロックされたシステム呼び出しが何らかの理由でブロックを解除されたとしても、リースロックを短縮したり、削除したりするプロセスは実行されます.なお、レンタルロックはファイル全体に対してのみ有効であり、記録レベルのロックは実現できない.