我正在为在某些条件下锁定文件(使用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 lockn";
break;
case F_UNLCK:
std::cout << "File is unlockedn";
break;
default:
std::cout << "Unexpected " << lock.l_type << "n";
break;
}
return EXIT_SUCCESS;
}
它将打印:
File is unlocked
那么,是否有一种方法可以测试是否持有fcntl
文件锁定?
另外,我可以使用的其他类型(Linux-Portable!(文件锁可以解决我的问题?
我不知道为此有任何"已经可用的库",但是在实现级别上,我建议您有一个记录文件,以跟踪。
您可以简单地创建一个名为" log"的文件,mmap(2(将其作为map_shared在每个过程中访问文件,并且每当文件锁成功时,请在该日志文件的末尾写入当前的过程'将偏移保持偏移到结尾是CAS。这将帮助您分析锁的顺序。
也许仅仅是通过在附加过程中打开文件并写信到最后,即当前过程的pid。
或更快地进行这样的测试的方法是创建MKFIFO(2(并写入该文件的FIFO文件。