我正在为大学编写TFTP服务器程序,该程序需要独占访问它打开的文件才能阅读。因此,可以配置为如果文件被另一个进程锁定,它等待文件解锁。
Win32上有没有办法等待文件解锁而不先创建一个句柄?
我问的原因是,如果另一个进程使用与我的进程使用的dwShareMode不兼容的dwShareMode调用CreateFile(),我甚至无法获得用于等待的文件句柄使用LockFileEx()锁定。
提前感谢您的帮助!
答案 0 :(得分:2)
作为来自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中公开公开,因此这些函数更改的可能性很低。
祝你好运!答案 1 :(得分: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进程可以使用LockFileEx()
来使用重复的HANDLE
。
此解决方案依赖于内部函数NtQuerySystemInformation()
和可用于枚举打开句柄的未记录的系统信息类值。请注意,NtQuerySystemInformation()
“的此功能可能会在将来的Windows版本中更改或不可用”。您可能希望使用SEH处理程序来防止发生的访问冲突。