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

时间:2019-06-08 22:59:39

标签: windows winapi

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

是不是因为父母没有足够快地阅读邮筒?有没有一种方法可以增加邮槽的容量,从而永远不会到达文件末尾?我真的看不到邮筒怎么会满了,只要 因为有足够的磁盘空间。

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);
}

1 个答案:

答案 0 :(得分:2)

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

如果ERROR_HANDLE_EOF-2个不同的NTSTATUS转换为它: STATUS_END_OF_FILESTATUS_FILE_FORCED_CLOSED。 {em> msfs.sys (用于处理邮槽的驱动程序)返回的STATUS_END_OF_FILE从不(看起来像)。从另一面看-如果将STATUS_FILE_FORCED_CLOSED的服务器端的数据写入邮槽(由msfs.MsCommonWrite),则可以返回CreateMailslot指定的文件已被另一个进程关闭。)。 mailslot(您通过MsFsdCleanup调用创建的信箱)已经关闭。 正式关闭最后一个服务器句柄时-所有连接的客户端都标记为处于关闭状态(在WriteFile内部),然后如果您为该客户端调用STATUS_FILE_FORCED_CLOSED-将返回TextSticker

如此-

  

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

服务器进程由于某种原因关闭了自己的邮槽句柄。您需要朝这个方向进行搜索-何时以及为何在父进程中关闭mailsot句柄