gpt4 book ai didi

c++ - 询问哪个进程锁定了 Windows C++ 中的文件

转载 作者:可可西里 更新时间:2023-11-01 09:20:45 24 4
gpt4 key购买 nike

我有 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() 的句柄。

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

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

谢谢。

最佳答案

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

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

关于c++ - 询问哪个进程锁定了 Windows C++ 中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17720315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com