gpt4 book ai didi

c++ - 如何判断当前进程是否已经锁定了一个文件?

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:37 24 4
gpt4 key购买 nike

我正在为一个可能在某些条件下锁定文件(使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com