1

私はアプリを書いていますが、その仕様では、書き込むたびにファイルをロックする必要があります (このファイルは、他のチームが取り組んでいる他のアプリに対して読み取られます)。

私は次の機能を作りました:

int lock_file (int fd)
{
    if (fd == -1)
        return -1;
    struct flock file_locker;
    file_locker.l_type = F_WRLCK;
    file_locker.l_whence = SEEK_SET;
    file_locker.l_start = 0;
    file_locker.l_len = 0; //lock the entire file

    int locked = fcntl(fd, F_SETLK, &file_locker);
    if (locked == -1){
        /*handle errors*/
        return 0;
    }
    return 1;
}

私は1つのリターンを得ることができます(すべてがOKであることを意味します)が、テストケースを作成すると、ロックされたファイルに書き込むことができました Oo

テストコードは次のとおりです。

char *file = "lock_test_ok";
int fd = open(file, O_RDWR);
int locked = lock_file(fd);
/* call popen and try write 'ERROR' in the file */

/* if the file contains ERROR, than fail */
4

3 に答える 3

5

Unix でのロックは推奨事項です。ロックをテストするプログラムのみが書き込みを行いません。(強制的なロックを提供するものもありますが、そうではありません。通常、ロックされたファイルに特別なプロパティを設定する必要があります。)

于 2011-01-10T20:31:38.547 に答える
2

最初のプロセスが存在し、そのファイル記述子がすべて閉じられると、ロックが解放されます。

編集: テストシナリオを誤解していると思います-popen()呼び出しはロックプロトコル(これは単なる助言であり、OSによって強制されていません)に従わないため、呼び出したプロセスがlock_file()まだ存在し、保持されていても書き込みが発生しますロック。

于 2011-01-10T20:28:15.673 に答える
0

ジムが言ったことに加えて、fcntlロックは勧告です。ファイルを開いたり書き込んだりすることを妨げるものではありません。それらが行う唯一のことは、他のプロセスが独自のfcntlロックを取得するのを防ぐことです。

ファイルへのすべてのライターを制御する場合、これは問題ありません。すべてのライターに最初にファイルのロックを試行させることができるからです。そうでなければ、あなたはうんざりしています。Unix は、「強制」ロック (失敗するロック、openまたはwrite失敗するロック) を提供しません。

于 2011-01-10T20:33:42.620 に答える