これらの三つの機能の役割は、ドキュメントにロックされている、と彼らは持っていること、それはどのような違いを作るのですか?
まず群れとfcntlシステムコール、LOCKFは、ライブラリ関数である一方で。LOCKF実際のfcntlパッケージ、達成底とfcntl LOCKF効果をロックすることは同じであるファイルに対して、同じです。ほとんどの場合、背後にfcntlを異なる点を分析し、まとめLOCKFとき。
まず、各機能の以下の使用を見て、それぞれの機能を使用する方法の観点から違い。
1.群れ
L関数のプロトタイプ
書式#include <sysの/ファイル.h>
INTフロック(int型FD、INT操作); //適用または削除 fdで指定されたオープンファイルの諮問ロックを、只是建议性锁
fdがオープンシステムコールによって返されたファイル記述子である場合、動作オプションは次のとおりです。
LOCK_SH:共有ロック
LOCK_EX:排他ロックまたは排他ロック
LOCK_UN:ロックを解除します。
LOCK_NB:非ブロッキング(上記3つの動作で使用するため)
群れの機能について、あなたは最初だけで、ファイル全体をロックすることができ群れ機能を知っている必要がありますが、まず重要なのfcntlする区別/ LOCKFがあるファイルの特定の部分にロックすることができず、後者の領域が提出することができますロック。
第二に、群れのみ激励のロックを生成します。私たちは、強制ロック(強制ロック)があることを知っているとロック(助言ロック)linuxと助言しました。いわゆる強制ロック、よりよく理解されている、あなたのドアのロックは、最も恐ろしいが、1つのキーだけであるということである、唯一のプロセスが動作することができます。いわゆるロックアドバイス、あなたがファイルにアクセスする前に、基本的に合意され、あなたはとても親切でなかった場合、その役割は読み書きする必要がある、行き当たりばったり、あった時にロックし、ロックを、確認し、その後、ロックが何かアドバイスはありません効果。そして、合意を順守する、ロックする前にチェックし、読み書きのプロセスは、連携処理と呼ばれます。
プラス、群れはLOCKFのみ排他ロックをサポートしていますが、パラメータはRDLCKロックを読み取ることができる群れFCNTL、ロックと排他ロックを共有している場合があります。
ここでも、話の背後にある主にフォークとDUPの時間差の群れとfcntl / LOCKFの違い、。
また、あなたはNFSファイルロックを使用したい場合は、fcntlのを使用してください、NFSファイルシステム上でもはや群れません。
その後、杭DUPフォークの群れの後ろとパフォーマンスの後に話します。あなたは、元のを見ることができます。
2. LOCKFとfcntl
L関数のプロトタイプ
書式#include <unistd.h>
int型LOCKF(int型のfd、int型CMD、off_t型LEN)。
fdがオープンで返されるオープンファイル記述子です。
cmdの値は次のとおりです。
F_LOCK:ファイルへのミューテックスロックファイルがロックされている場合、ロックが解除されるまで、それはブロックします。
F_TLOCKは:F_LOCKで、ファイルがロックされているものの場合、ブロックが、戻ってエラーを返していません。
F_ULOCK:ロックを解除します。
ファイルがロックされているかどうかをテストし、ファイルがそうでなければ0を返し、-1ロックされていない場合:F_TEST。
LEN:ロックの初期長さに現在の位置からのファイル。
関数関数のパラメータによって、それはLOCKF見ることができる唯一の排他的ロックをサポートし、共有ロックをサポートしていません。
書式#include <unistd.h>
書式#include <fcntl.h>
int型のfcntl(int型のfd、int型CMD、... / *引数* /);(用法:int型RET = fcntlの(FD 、F_SETLKW 、&ロック);)
実際には、ロックは次のようなデータ構造であります:
構造体フロック{
...
短いL_TYPE;ロックの/ *タイプ:F_RDLCK、F_WRLCK、F_UNLCK * /
短いl_whence; / * l_startの見方:SEEK_SET、SEEK_CUR、SEEK_END *を/
l_startのoff_t型; / * *ロックの開始オフセット/
l_len off_t型; / *ロックするバイト数* /
pid_tはl_pid。私たちのロックを遮断するプロセスの/ * PID(F_GETLKのみ)* /
...
}。
cmdの三つのカテゴリーに関連したレコードロックファイル:
F_SETLK:アプリケーションロックまたは(F_UNLCK)を放出(ロックF_WRLCKを書き、ロックF_RDLCKを読んで)ロックがカーネル・プロセスに付与することができない場合は、しかし、(別のプロセスによってロックを占め、前奪わ)、ないShadeng、リターンエラー。
F_SETLKW:F_SETLKとほぼ同じで、唯一の違いは、この男は頑固な朱のErで、あなたShadeng、対象となりません。
F_GETLK:このインタフェースは、ロック情報を得ることである:このインタフェースは、当社の着信構造体の群れを変更します。
それは、最も強力であり、両方の共有ロックをサポートし、ファイル全体が、ロックファイルの特定の部分のみをロックすることができます排他ロックをサポートするパラメータの関数fcntlの機能を通して見ることができます。
の特性にfcntl / LOCKFを見てみましょう:
再帰1. (フロックを有します)
2.ファイルを開くために書かれなければならないファイルを読むために開かれ、プラス書き込みロック(排他ロック)されなければならない読み取りロック(共有ロック)を追加します。
3.プロセスは、ファイル自体の特定の一部かどうかをテストし、その後F_GETLKコマンドを使用してロックを保持することができません。
4.処理が終了すると、彼はファイルロックを築いていたすべてがリリースされます(群れで)。
あなたがファイルを参照することができる記述子のいずれかのロックを通じて、プロセスを記述を閉じる任意の時点で5は、(ロックがプロセスに設定されている)にリリースされている群れ異なります。
FD1 = オープン(パス名、...);
LOCKF(FD1、F_LOCK、0);
FD2 = DUP(FD1);
閉じる(FD2);
場合は、次に近い(FD2)の後、ロックは、FD1がリリースされる予定再び提供DUPは、同じ文字の別の記述上のファイルを開くには、オープン置き換え、その後、効果は同じです。
= FD1 オープン(パス名、...);
LOCKF(FD1、F_LOCK、0);
FD2 = オープン(パス名、...); 閉じる(FD2)。
6.フォークで作成された子プロセスは親が設定したロックを継承しない、これは群れでも異なっています。(ロック群れが作成されますのでので、ロックを操作できるFDをコピーし、FDのではなく、関連する)オープンエントリ(構造体のファイルをファイル、その子は閉じるにはロック.flock内の親プロセスを継承しますすべてのFDをコピーし、ロックが解除されます)
7. EXECを実行した後、新しいプログラムが元のプログラムをロック継承することができ、この点と、群れがある同じ。(FDがクローズ(close-on-exec)設定されている場合は、元幹部は、FDを閉じ、ファイルのロックが解除されます)。
(8.サポート強制ロックフロックとは異なります)。次は話します。
3. 2つのロック関係
そして、それをしなければならない群れとLOCKF / fcntlの上のロック?独立して答えを互いの。次のように試験手順は以下のとおりです。
#含める<unistd.h>
#含める<stdio.hの> #含める<STDLIB.H> #含めるは<sys /ファイル.h> int型のmain(int型ARGC、チャー** ARGV){int型のFD、RET。PIDのint; FD =オープン(" ./tmp.txt " 、O_RDWR)。RET = フロック(FD、LOCK_EX)。printf(" リターンRET群れ:%dは\ nを" 、RETを)。RET = LOCKF(FD、F_LOCK、0); printf(" LOCKFリターンRET:%dは\ nを" 、RET)。スリープ(100 ); リターン0; }
次のようにテスト結果は以下のとおりです。
$。/ a.outの
リターンRETを群れ:0
LOCKFリターンRET:0
ロックの可視群れのロックLOCKFには影響を与えません。我々は2つの外側のロック状態の/ proc /ロックがプロセスを表示得ることができます。
$ PsのAUX | grepのa.outの| grepの-v grepを
123751 18849 0.0 0.0 11904 440 PTS / 5 S + 1:09午前0時00 ./a.out
$ sudoの猫の/ proc /ロック| grepの18849
1:POSIX ADVISORYは、WRITE 18849 08:02:852674 0 EOF
2:FLOCK顧問WRITE 18849 08:02:852674 0 EOF
私たちは見ることができるの/ proc /ロックは、以下の情報をロック:私は今の意味で説明されています:
ロックの種類である1)のPOSIX FLOCKこの比較的明確。フロックシステムコールはFLOCK、F_SETLKを呼び出すFCNTL、F_SETLKWのLOCKFまたはPOSIXタイプが生成され、ロックの種類が異なるコールの二種類を生成することが見出されているが生成されます。
2)アドバイザリロックが助言されていることを示します。
3)、示唆書き込みロック、ならびに読み取りロックで名前を書きます。
4)18849は、ロックIDを保持しているプロセスです。群れのためのロックのもちろん、このタイプ、状況は次のようになりますプロセスから撤退しています。
5)8時02分:対応するディスクは852 674代表、マイナー番号、およびファイルはinode番号に対応するファイルグッドマスタデバイス。
6)0位置ことを意味します
7)EOF表現の終了位置です。これらの2つのフィールドは、より便利にfcntlタイプです0とEOFに群れすることは常にあります。
強制ロックをサポートFCNTL:特定のファイルセットグループIDビット(S_ISGID)を開き、そのグループビット(S_IXGRP)を実行閉じ、次に必須機構をロックファイルを開くこと。Linuxを使用している場合は、強制ロックは、このメカニズムを、マウント使用-omand開くファイルシステムになります。
この記事を参照してください。
http://blog.jobbole.com/16882/
fcntlのロック付:
#含める<stdio.hの>
#含める<fcntl.h> int型のmain(int型ARGC、チャー** ARGV){ IF(ARGC> 1 ){int型FD =オープン(ARGV [1 ]、O_WRONLY)。IF(FD == -1 ){のprintf(" ファイル\ nを開くことができません" )。出口(1 )。}静的構造体フロックロック。lock.l_type = F_WRLCK。lock.l_start = 0; lock.l_whence = SEEK_SET。lock.l_len = 0; lock.l_pid = GETPID()。int型RET = fcntlの(FD、F_SETLKW、&ロック)。printf(" のfcntlの戻り値:%Dを\ n " 、RET)。IF(RETの== 0){ ながら(1 ){scanf関数(" %のC" 、NULL);}}}}
以下に示すように、ルートファイルシステムを再マウントする「MAND」パラメータを指定してmountコマンドを使用します。これは、ファイルシステムレベルでの強制ロック機能が有効になります。注意:あなたは、次のコマンドを実行することができ、rootユーザーに切り替える必要があります。
#マウント-oremount、MAND /
「advisory.txt」との「mandatory.txt」の実行可能ファイルという2つの(file_lock)のディレクトリを作成します。グループ実行ビットを有効にしていないながら、次のように「mandatory.txt」について、セットグループIDを有効にします。
#1 advisory.txtタッチ
#のタッチmandatory.txt #1 のchmod G + S、GXのmandatory.txt
テストは共同ロック:
パラメータとして「advisory.txt」へのサンプル・プログラムの実行。#1 advisory.txt ./File_lock
このプログラムは、ユーザーの入力を待ちます。別の端末またはコンソールから、次のコマンドライン(ロックはチェックしません、直接入力)してみてください:#上記の例ではLS >> advisory.txtを、advisory.txtにLSコマンドは、ファイルに出力を書き込みます。私たちが書き込みロックを取得した場合でも、まだいくつかのプロセス(非協力は)ファイルにデータを書き込むことができますが存在します。これは「相乗効果」ロックと呼ばれています。
強制ロックをテストします。
パラメータとして「mandatory.txt」に再びサンプルプログラムを実行します。#./File_lock mandatory.txt
別の端末またはコンソールから、次のコマンドライン試してください:#上記の例ではLS >> mandatory.txtを、LSコマンドそれは出力ファイルmandatory.txtに書き込まれる前に、なりますファイルロックを待つが除去されます。それはまだ非協力プロセスですが、強制ロックは、役割を果たしたものの。