c fcntl抽象化関数は機能しません
質問
私はアプリとその仕様に、私が書くたびにファイルをロックする必要があるという仕様に書いています(このファイルは、他のチームが取り組んでいる他のアプリのために読み取られます):
次の機能を作成しました。
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つのリターンを取得できます(すべてが問題ないことを意味します)が、テストケースを作成したとき、ロックされたファイル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 */
解決
Unixでのロックはアドバイザリーです。ロックをテストするプログラムのみが書き込みません。 (一部のロックを提供するものもありますが、そうではありません。通常、ロックされたファイルに特別なプロパティのセットアップが含まれます。)
他のヒント
ロックは、最初のプロセスが存在し、そのファイル記述子がすべて閉じているときにリリースされます。
編集: テストシナリオを誤解したと思います popen()
コールはロックプロトコル(これはアドバイザリーのみであり、OSによって強制されていない)に従うことはありません。 lock_file()
まだ存在し、ロックを保持しています。
ジムが言ったことに加えて、 fcntl
ロックはそうです アドバイザリー. 。彼らはそうします いいえ 誰もがファイルを開いて書き込むことを防ぎます。彼らがする唯一のことは、他のプロセスが自分のプロセスを取得するのを防ぐことです fcntl
ロック。
すべてのライターをファイルに制御する場合、これは問題ありません。なぜなら、すべてのライターに最初にファイルをロックしようとすることができるからです。そうでなければ、あなたはホースとなります。 Unixは「必須の」ロックを提供しません(原因となるロック open
また write
失敗する)。