如何判断当前进程是否已锁定文件?

时间:2019-05-02 01:21:49

标签: c++ linux fcntl

我正在编写一个单元测试,该函数在某些情况下可能会锁定文件(使用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 :(得分:0)

好吧,我不知道有什么“可用的库”,但是在实现级别上,我建议您有一个日志文件来跟踪该情况。

您可以简单地创建一个名为“ log”的文件,将其以MAP_SHARED的形式mmap(2)创建到访问该文件的每个进程中,并且只要文件锁定成功,就在该日志文件的末尾写入当前进程的pid,并保持偏移量为以CAS结尾。这将帮助您分析锁的顺序。

也许只是通过在追加文件中打开文件并最后写入当前进程的pid来结束

或者做这种测试的更快方法是通过mkfifo(2)创建一个fifo文件并写入该文件。