询问哪个进程在Windows C ++中锁定了一个文件

时间:2013-07-18 10:00:54

标签: c++ windows porting

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

我已成功移植了类中的所有其他代码,并使用锁定文件 LockFile(句柄,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。

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

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

感谢。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我只是在Google上搜索,但我找到了this

  

“各种C语言运行时系统将IOCTL用于目的   与Windows套接字无关。因此,ioctlsocket   函数和 WSAIoctl 函数被定义为处理套接字   由IOCTL和Berkeley中的 fcntl 执行的功能   软件分发。“

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