我有2个应用程序共享相同的locking文件,我需要知道另一个应用程序何时locking/解锁文件。 下面的代码最初是在一台Linux机器上实现的,正在被移植到Window 8,VS12。
我已经成功移植了类中的所有其他代码,并使用LockFile(句柄0,0,sizeof(int),0)和等效的UnlockFile(…)来locking文件。 但是,我有以下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。
我似乎无法find相当于fcntl F_GETLK命令的Windows。 有谁知道我是否可以:a)使用相当于fcntl查询locking信息,找出哪个进程已经获得锁b)build议如何重写上述的Windows C ++。
注意:使用locking文件的服务器应用程序是独立的C ++可执行文件,但使用locking文件的客户端是WinRT Windows应用程序。 因此,任何build议的解决scheme都不能破坏客户端的沙盒。
谢谢。
你不会在Windows上找到这个,它在多任务操作系统上基本上是不健康的。 您从IsFileLocked()api函数获得的值是没有意义的,另一个进程或线程仍然可以在一微秒之后锁定文件。
解决方法很简单,如果你需要锁定,然后试图获得一个。 如果文件已经被锁定,那么LockFile()将简单地返回FALSE,GetLastError()告诉你为什么。 现在它是原子的 ,是锁的一个重要属性。 如果您可以等待锁定,则使用LockFileEx()而不使用LOCKFILE_FAIL_IMMEDIATELY选项。
我只是为你搜索,但我发现了这一点
“各种C语言运行时系统都将IOCTL用于与Windows套接字无关的目的,因此,定义了ioctlsocket函数和WSAIoctl函数来处理由Berkeley Software Distribution中的IOCTL和fcntl执行的套接字函数。
这里也有一个简短的讨论 – 它是基于python的,但有一些线索。