Как узнать, заблокировал ли текущий процесс файл? - PullRequest
0 голосов
/ 02 мая 2019

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

1 Ответ

0 голосов
/ 02 мая 2019

Ну, я не знаю ни одной «уже доступной библиотеки» для этого, но на уровне реализации я бы предложил вам иметь файл журнала, который отслеживает это.

Вы можете просто создать файл с именем«Log», mmap (2) это как MAP_SHARED для каждого процесса, обращающегося к файлу, и всякий раз, когда блокировка файла завершается успешно, пишите pid текущего процесса в конце этого файла журнала, сохраняя смещение до конца с помощью CAS. Это поможет вам проанализироватьпорядок блокировок.

Может быть, просто открыв файл в append more и записав в конец pid текущего процесса.

Или, возможно, более быстрый способ сделать такой тест - создатьфайл fifo от mkfifo (2) и запишите в этот файл.

...