■掲示板やカウンターで使用するファイルロックについて
CGIが同時に動作するとデータファイルを二重アクセスしてしまうことがあります。
同時にファイルを書き込んでしまうと、データファイルが破損してしまうことがあります。
通常、これを回避するため、ロックファイルを作って順々に処理されるようにします。
※サーバーによっては各種インストールソフトウェアのバージョンや仕様が異なる場合がございます。
[flock 関数を使った、ロック開始とロック終了の処理の例]
int lock(char* fname) ←ファイル名を与えると、そのファイルをロックして
{ ファイルハンドルを返す。すでに他からロックされ
int fd; ていたときはブロックする。
if ((fd = open(fname, O_WRONLY)) < 0 &&
(fd = open(fname, O_CREAT|O_WRONLY, 0664)) < 0) {
return -1;
}
flock(fd, LOCK_EX);
lseek(fd, 0, SEEK_END);
return fd;
}
int unlock(int fd) ←ロックしたときのファイルハンドルを与えると、
{ ロックが解除される。この処理を行わなくても
flock(fd, LOCK_UN); プログラム終了時に自動的に解除されます。。
return close(fd);
}
|
|
ここで、lock()に与えるファイル名は、データファイルの名前以外にするよう注意してください。
(CGI中からデータファイル自体が開けなくなってしまいます)
※ 一般的に、 link / unlink や open 関数を使って疑似的なロック処理を行われているCGIがありますが、
全く同時に link , open したときなどは、処理が固まってしまうことがあるためおすすめできません。
flock関数はファイルロックのために用意されている関数で、弊社のサーバ(OSはFreeBSD)で問題なく使用可能です。
「独自のCGIやSSIを設置する方へ」へ戻る
さくらウェブオンラインマニュアルへ戻る
|