我正在为大学编写TFTP服务器程序,该程序需要独占访问它打开的文件才能阅读 . 因此,可以配置为如果文件被另一个进程锁定,它等待文件解锁 .
有没有办法在Win32上等待文件解锁而不先创建一个句柄?
我问的原因是,如果另一个进程使用与我的进程使用的dwShareMode不兼容的dwShareMode调用CreateFile(),我甚至无法使用LockFileEx()获取用于等待锁的文件句柄 .
感谢您的帮助!
我正在为大学编写TFTP服务器程序,该程序需要独占访问它打开的文件才能阅读 . 因此,可以配置为如果文件被另一个进程锁定,它等待文件解锁 .
有没有办法在Win32上等待文件解锁而不先创建一个句柄?
我问的原因是,如果另一个进程使用与我的进程使用的dwShareMode不兼容的dwShareMode调用CreateFile(),我甚至无法使用LockFileEx()获取用于等待锁的文件句柄 .
感谢您的帮助!
2 回答
如果您查看Stack Overflow问题What Win32 API can be used to find the process that has a given file open?和SYSTEM_HANDLE_INFORMATION structure,您将找到可用于枚举进程和每个正在运行的进程的所有打开句柄的代码的链接 . 此信息可用于获取文件打开的进程的
HANDLE
以及文件的HANDLE
. 然后,您将使用DuplicateHandle()创建文件HANDLE
的副本,但在TFTP进程中的句柄表 . 然后,TFTP进程可以使用重复的HANDLE
和LockFileEx() .此解决方案依赖于内部函数
NtQuerySystemInformation()
和可用于枚举打开句柄的未记录的系统信息类值 . 请注意NtQuerySystemInformation()
"may be altered or unavailable in future versions of Windows"的此功能 . 您可能希望使用SEH处理程序来防止发生的访问冲突 .正如来自MS的工具(如OH和Process Explorer)所做的那样,绝对有可能获得流程打开的所有句柄 . 从那里等待你想要的道路仍然很长,但这是一个开始:)
如果你没有成功使用Win32 API,一个值得关注的地方肯定是NT Native API http://en.wikipedia.org/wiki/Native_API
您可以从这里开始http://msdn.microsoft.com/en-us/library/windows/desktop/ms724509%28v=vs.85%29.aspx并查看它是否与SystemProcessInformation标志一起使用 . 看这里也是一个开始http://nsylvain.blogspot.com/2007/09/how-list-all-open-handles.html
本机API文档很少,但您可以在线查找资源(例如http://www.osronline.com/article.cfm?id=91)
作为免责声明,我应该补充一点,Native API在某种程度上是“内部的”,因此在未来的版本中会有所变化 . 但是,某些函数在内核级别也在DDK中公开公开,因此这些函数更改的可能性很低 .
祝好运!