Я пишу модульные тесты для функции, которая может блокировать файл (используя 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!) Блокировок файлов, которые я мог бы использовать, чтобы решить мою проблему?