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() 会阻塞?