我正在编写一个单元测试,该函数在某些情况下可能会锁定文件(使用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便携式!)文件锁来解决我的问题吗?
答案 0 :(得分:0)
好吧,我不知道有什么“可用的库”,但是在实现级别上,我建议您有一个日志文件来跟踪该情况。
您可以简单地创建一个名为“ log”的文件,将其以MAP_SHARED的形式mmap(2)创建到访问该文件的每个进程中,并且只要文件锁定成功,就在该日志文件的末尾写入当前进程的pid,并保持偏移量为以CAS结尾。这将帮助您分析锁的顺序。
也许只是通过在追加文件中打开文件并最后写入当前进程的pid来结束
。或者做这种测试的更快方法是通过mkfifo(2)创建一个fifo文件并写入该文件。