【问题标题】:Interogate which process has locked a file in Windows C ++询问哪个进程锁定了 Windows C++ 中的文件
【发布时间】:2013-07-17 05:13:34
【问题描述】:

我有 2 个应用程序共享同一个锁定文件,我需要知道何时 另一个应用程序已锁定/解锁文件。下面的代码是 最初是在 Linux 机器上实现的,现在正在移植到 Window 8,VS12。

我已经成功移植了类中的所有其他代码,并且正在锁定文件 LockFile(handle, 0, 0, sizeof(int), 0) 和等效的 UnlockFile(...)。然而, 我在使用以下 wait() 命令时遇到问题。

bool devices::comms::CDeviceFileLock::wait(bool locked,
                                           int  timeout)
{
   // Retrieve the current pid of the process.
   pid_t pid = getpid();

   // Determine if we are tracking time.
   bool tracking = (timeout > 0);

   // Retrieve the lock information.
   struct flock lock;
   if (fcntl(m_iLockFile, F_GETLK, &lock) != 0)
      raiseException("Failed to retrieve lock file information");

   // Loop until the state changes.
   time_t timeNow  = time(NULL);
   while ((pid == lock.l_pid) 
          &&
          (lock.l_type != (locked ? F_WRLCK : F_UNLCK)))
   {
      // Retrieve the lock information.
      if (fcntl(m_iLockFile, F_GETLK, &lock) != 0)
         raiseException("Failed to retrieve lock file information");

      // Check for timeout, if we are tracking.
      if (tracking)
      {
         time_t timeCheck = time(NULL);
         if (difftime(timeNow, timeCheck) > timeout)
            return false;
      }
   }

   // Return success.
   return true;
}

注意:m_iLockFile 以前是来自 open() 的文件描述符,现在称为 m_hLockFile 是来自 CreateFile() 的 HANDLE。

我似乎找不到 fcntl F_GETLK 命令的 Windows 等效项。 有谁知道我是否可以: a) 使用 fcntl 等价于询问锁定信息,找出 哪个进程获得了锁 b) 建议如何为 Windows C++ 重写上述内容。

注意:使用锁定文件的服务器应用程序是一个独立的 C++ 可执行文件, 但是使用锁定文件的客户端是 WinRT Windows 应用程序。所以任何 建议的解决方案不能破坏客户端的沙盒。

谢谢。

【问题讨论】:

    标签: c++ windows porting


    【解决方案1】:

    您不会在 Windows 中找到它,它在多任务操作系统上根本不可靠。你从 IsFileLocked() api 函数得到的值是没有意义的,另一个进程或线程仍然可以在一微秒后锁定文件。

    解决方法很简单,如果您需要锁定,则只需尝试获取一个。如果文件已经被锁定,那么 LockFile() 将简单地返回 FALSE,GetLastError() 会告诉你原因。现在它是atomic,是锁的基本属性。如果您有能力等待锁定,请使用不带 LOCKFILE_FAIL_IMMEDIATELY 选项的 LockFileEx()。

    【讨论】:

      【解决方案2】:

      我只是在谷歌上搜索你,但我找到了this

      “各种 C 语言运行时系统使用 IOCTL 来达到目的 与 Windows 套接字无关。因此,ioctlsocket 定义了函数和 WSAIoctl 函数来处理套接字 由 IOCTL 和 fcntl 在伯克利执行的功能 软件分发。”

      还有一个简短的讨论here - 它是基于python但有一些线索。

      【讨论】:

      • 阅读 WSAIoctl 的文档,它似乎只处理专门用于套接字的 fcntl 函数,而不是文件。它的第一个参数是 SOCKET 而不是 HANDLE。
      • 运气不好 - 我没办法,所以我会坐下来看看。祝你好运。
      猜你喜欢
      • 1970-01-01
      • 2010-10-26
      • 2011-01-29
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多