如何判断当前过程是否已经锁定文件



我正在为在某些条件下锁定文件(使用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文件。

相关内容

  • 没有找到相关文章

最新更新