c++ - 如何判断当前进程是否已经锁定了一个文件?

标签 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 可移植!)文件锁来解决我的问题吗?

最佳答案

好吧,我不知道有任何“已经可用的库”用于此,但在实现级别上,我建议您有一个日志文件来跟踪它。

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

也许只是通过打开文件追加更多并写入末尾,当前进程的 pid。

或者也许更快的方法是通过 mkfifo(2) 创建一个 fifo 文件并写入该文件。

关于c++ - 如何判断当前进程是否已经锁定了一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944551/

相关文章:

关于 PCA9555 扩展器上#interrupt-cells 配置的混淆

python - 如何正确地将 C ioctl 调用转换为 python fcntl.ioctl 调用?

linux - Linux/GCC 是否支持文件共享允许-拒绝类型?

c++ - "C++ most vexing parse"的运行时行为

c++ - 是否可以将一个字符串的两个索引添加到一个字符,然后将该字符转换为 C++ 中的 int?

.net - 使用启动脚本运行 `Unhandled Exception: System.ArgumentNullException: Value cannot be null.` 时出现 `dotnet run` 错误

linux - 按可变范围的行拆分文件

c - 什么时候需要 F_GETFL fcntl 命令的参数?

c++ - 内联结构声明的大小

c++ - 输入信息的员工类C++。