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

标签 windows winapi

什么会导致 WriteFile 返回错误 38(ERROR_HANDLE_EOF,已到达文件末尾)?本例中的"file"是一个邮槽。我的程序的工作方式是我有一个创建多个子进程的进程(作为 Windows 服务运行)。每个 child 都打开一个同名的邮槽,以便将状态信息发送回其 parent 。在我的小规模测试中,这工作正常,但我看到了当我有多个进程时的情况 运行(如 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);
}

最佳答案

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_CLOSEDSTATUS_END_OF_FILE 从未(看起来像)由 msfs.sys(处理邮槽的驱动程序)返回。从另一边 - STATUS_FILE_FORCED_CLOSED(指定的文件已被另一个进程关闭。)可以在将数据写入邮槽时返回(通过 msfs.MsCommonWrite) 如果邮槽的服务器端(您通过 CreateMailslot 调用创建的端)已经关闭。 正式关闭最后一个服务器句柄时 - 所有连接的客户端都标记为处于关闭状态(在 MsFsdCleanup 内),然后如果您为此类客户端调用 WriteFile - STATUS_FILE_FORCED_CLOSED 被返回。

所以 -

What causes WriteFile to return error 38 (ERROR_HANDLE_EOF)?

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

关于windows - 是什么导致 WriteFile 返回错误 38 (ERROR_HANDLE_EOF)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56510727/

相关文章:

visual-studio - 未解析的外部符号 _pathCombineW()

node.js - 如果在 Git bash (mintty) 中使用 npm 脚本,则没有控制台颜色

python - 在python中使用winmm.dll获取输入设备

c++ - 如何验证用户登录到域或本地

c++ - 在优化校准中绘制图像

c++ - 'GetProcessIdOfThread' : identifier not found

c++ - 如何调用另一个对话框(Win32 应用程序)

windows - 如何将 SetThreadAffinityMask 与 QueryPerformanceFrequency 一起使用?

c++ - 导入库如何工作以及为什么 MinGW 不需要它们?

windows - 系统 dll(如 kernel32.dll)是如何签名的