首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么导致WriteFile返回错误38 (ERROR_HANDLE_EOF)?

是什么导致WriteFile返回错误38 (ERROR_HANDLE_EOF)?
EN

Stack Overflow用户
提问于 2019-06-08 22:59:39
回答 1查看 935关注 0票数 1

什么会导致WriteFile返回错误38 (ERROR_HANDLE_EOF,到达文件的末尾)?本例中的“文件”是一个邮件插槽。我的程序的工作方式是我有一个创建多个子进程的进程(作为Windows服务运行)。每个子节点都会打开一个同名的邮件槽,以便将状态信息发送回其父节点。在我的小规模测试中,这是很好的,但我看到的情况是,当我有几个进程运行(比如16个)时,我会得到这个错误。下面的代码显示了我是如何在子进程中打开和写入邮件槽的。

这可能是因为家长没有足够快地读取邮件槽吗?是否有一种方法可以增加邮件时隙的容量,从而永远不会到达文件的末尾?我真的不明白,只要有磁盘空间(有足够的磁盘空间),邮件插槽怎么会满。

代码语言:javascript
复制
char gLocalSlotName[256]="\\\\.\\mailslot\\TMAgentSlot-ComputerName";

gAgentSlot = CreateFile(gLocalSlotName, GENERIC_WRITE, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL,
                               OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);


fResult = WriteFile(gAgentSlot, (char *)&ProcStat, sizeof(PROCSTAT), &cbWritten, (LPOVERLAPPED) NULL);
if (!fResult) {
  derr = GetLastError();
  printf("WriteFile error=%d", derr);
}
EN

回答 1

Stack Overflow用户

发布于 2019-06-09 00:41:15

WriteFileNtWriteFile上的薄壳。如果NtWriteFile返回错误NTSTATUS --它将转换为其等效的win32错误代码(通过RtlNtStatusToDosError),并且WriteFile返回false。您可以通过win32获得GetLastError()错误代码。但是,您可以通过由NTSTATUS api导出的RtlGetLastNtStatus()获得原始的ntdll.dll。win32错误代码的问题--一些时候,几个不同的NTSTATUS值转换为相同的win32错误。

万一ERROR_HANDLE_EOF -2不同的NTSTATUS转换成它:STATUS_END_OF_FILESTATUS_FILE_FORCED_CLOSEDSTATUS_END_OF_FILE从不(看起来像)由msfs.sys (处理邮件插槽的驱动程序)返回。来自另一方- STATUS_FILE_FORCED_CLOSED (指定的文件已被另一个进程关闭)。如果邮件槽的服务器端(通过msfs.MsCommonWrite调用创建的)已经关闭,则可以在将数据写入邮件槽(通过CreateMailslot )时返回。正式地说,当最后一个服务器句柄关闭时-所有连接客户端标记为关闭状态(在MsFsdCleanup中),然后如果您为这样的客户机调用WriteFile,则返回STATUS_FILE_FORCED_CLOSED

所以-

是什么导致WriteFile返回错误38 (ERROR_HANDLE_EOF)?

服务器进程由于某种原因关闭了自邮件槽句柄。您需要在此方向搜索??在父进程中关闭mailsot句柄的时间和原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56510727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档