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