同じロック ファイルを共有する 2 つのアプリケーションがあり、もう一方のアプリケーションがいつファイルをロックまたはロック解除したかを知る必要があります。以下のコードは、もともと Linux マシンに実装されており、Windows 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() のハンドルです。
fcntl F_GETLK コマンドに相当する Windows が見つからないようです。次のいずれかができるかどうかは誰にもわかりますか?
注: ロック ファイルを使用するサーバー アプリケーションはスタンドアロンの C++ 実行可能ファイルですが、ロック ファイルを使用するクライアントは WinRT Windows アプリケーションです。したがって、提案されたソリューションは、クライアントのサンドボックス化を壊すことはできません。
ありがとう。