1

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

4

0 回答 0