我正在为一个可能在某些条件下锁定文件(使用 fcntl(fd, F_SETLK, ...)
)的函数编写单元测试。
我希望我的单元测试能够预测文件在某些点是否被锁定。但我找不到任何方法来测试它。我尝试过使用 F_GETLK
,但它只会告诉您是否无法放置锁。由于给定进程可以根据需要多次重新锁定同一文件,F_GETLK
返回 F_UNLCK
,表示文件已解锁。
例如,如果我运行以下小程序:
int main(int argc, char** argv) {
int fd = open("/tmp/my_test_file", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd < 0) {
return EXIT_FAILURE;
}
// Initial lock
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0; // Lock entire file.
if (fcntl(fd, F_SETLK, &lock) < 0) {
return EXIT_FAILURE;
}
// Test lock:
lock.l_type = F_WRLCK;
lock.l_pid = 0;
if (fcntl(fd, F_GETLK, &lock) < 0) {
return EXIT_FAILURE;
}
switch (lock.l_type) {
case F_WRLCK:
std::cout << lock.l_pid << " is holding the lock\n";
break;
case F_UNLCK:
std::cout << "File is unlocked\n";
break;
default:
std::cout << "Unexpected " << lock.l_type << "\n";
break;
}
return EXIT_SUCCESS;
}
它将打印:
File is unlocked
那么,有没有办法让进程测试它是否持有 fcntl
文件锁?
此外,我可以使用其他类型的(Linux 可移植!)文件锁来解决我的问题吗?
最佳答案
好吧,我不知道有任何“已经可用的库”用于此,但在实现级别上,我建议您有一个日志文件来跟踪它。
您可以简单地创建一个名为“log”的文件,mmap(2) 将其作为 MAP_SHARED 进入访问该文件的每个进程,并且每当文件锁定成功时,将当前进程的 pid 写入该日志文件的末尾,保持偏移量为CAS结束。这将帮助您分析锁的顺序。
也许只是通过打开文件追加更多并写入末尾,当前进程的 pid。
或者也许更快的方法是通过 mkfifo(2) 创建一个 fifo 文件并写入该文件。
关于c++ - 如何判断当前进程是否已经锁定了一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944551/