トップページ サービスご案内 お知らせ お申込み お問い合わせ コミュニティ サポート オンラインマニュアル

■掲示板やカウンターで使用するファイルロックについて

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を設置する方へ」へ戻る

    さくらウェブオンラインマニュアルへ戻る



(C)Copyright 1996-2001, SAKURA Internet Inc.