SQLite の新しい実験的機能は、ある時点でブロッキング posix ロックを使用します。OSX でのこの fcntl() 呼び出しでプロセスがブロックされるというテスト ケースがありますが、その理由がわかりません。同じテストが Linux でも機能しますが、これは幸運なタイミングかもしれません。
呼び出しは次のとおりです。
fcntl(fd, F_SETLKW, &f);
ここで、「f」は次のとおりです。
$1 = {
l_start = 120,
l_len = 1,
l_pid = 0,
l_type = 3,
l_whence = 0
}
[lsof] によると、ファイルが開いているのは私のプロセスだけです。
bash-3.2$ sudo lsof test.db-shm
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
testfixtu 21393 dan 10u REG 14,2 32768 228781731 test.db-shm
ただし、fcntl() が最初に呼び出されたときに、他のプロセスが競合するロックを保持していた可能性があります。
gdb は fcntl() に渡されるファイル記述子が「10」であることを示しているので、有効だと思います。
私の質問は、他のプロセスがファイルを開いていない場合、なぜ fcntl() がブロックされるのでしょうか?