2

プログラムの動作がわかりません。

int MyOpenWrite(char *name,int flags) {
    int fd;
       unsigned long tm;
    unsigned long t;

    tm=time(0)+5;  //5 seconds
    for (;;) {
        fd = open(name,flags,S_IREAD|S_IWRITE|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
        if (fd>0) break;
        if (time(0)>=tm) return -1;
    } 
    //1111111111111111111
    LockFile(fd);
        DelayInSeconds(60);
    //2222222222222222222222
    return fd;
}

int LockFile(int fd) //return 0 - OK; -1 - Error
{
    struct flock    lock;

    lock.l_type = F_WRLCK;
    lock.l_start = 0;
    lock.l_whence = SEEK_SET;
    lock.l_len = 0;
    return fcntl(fd,F_SETLKW,&lock);
}

これはcgi-binプログラムです。あるファイルにデータを追加するリクエストを1つ開始しました。ご覧のとおり、ロック後60秒間遅延します。次に、この遅延なしにプログラムを再コンパイルし、次の要求を実行しました。2番目のプログラムは、最初のプログラムが終了するまで//1111と//2222の間で待機しています。2番目のプログラムが5秒間待機した後、-1コードでMyOpenWriteに戻ることを期待していました。しかし、開封サイクルに遅れはありません。ただし、LockFileには長い遅延があります。ここで何が問題なのですか?ありがとう!

4

1 に答える 1

1

これは、アドバイザリ ロックを使用しているために発生します。つまり、ファイルを開くことは物理的にブロックされていませんが、代わりに を介してリーダーとライターを調整しfcntl()ます。

どちらのバージョンのコードも に対して同じコードを使用しています。LockFile()つまり、2 番目のコードは最初のコードを待機します。open()ファイルが存在しないか、読み取りおよび書き込み用に開くことができない場合を除き、呼び出しが失敗する可能性はほとんどありません。

ファイルがすでにロックされているときに待機したくない場合は、F_SETLK代わりにF_SETLKW. -1ロックを取得できなかった場合は、すぐに戻ります。

于 2013-03-05T15:39:42.563 に答える