是否可以调用 WriteFile 并且应用程序将永远等待回调?

Posted

技术标签:

【中文标题】是否可以调用 WriteFile 并且应用程序将永远等待回调?【英文标题】:Is it possible to call WriteFile and the application will wait for the callback forever? 【发布时间】:2012-04-23 11:08:17 【问题描述】:

我调用方法win32::WriteFile 然后我调用

WaitForSingleObject( handle, INFINITE )

使用与WriteFile 调用中相同的句柄。

是否有可能有一些场景让我永远等待......而WriteFile 不会完成他的写作?我要写 512 kB,我假设我的硬件没有问题。

我希望得到FAIL 而不是永远等待。

【问题讨论】:

您必须使用带有一些标志的 OVERLAPPED IO 才能进行非阻塞写入系统调用。 那我不明白你的问题......也许你可以改写它或发布一些代码来澄清。 '我在 WriteFile 中使用的相同句柄' - 你的意思是我在 _OVERLAPPED struct hEvent 字段中使用的相同句柄? 对管道的写入将挂起,直到管道缓冲区有空间(或读取端关闭)。如果用户已暂停控制台,则写入控制台将挂起。可能还有其他情况。 【参考方案1】:

当您进行重叠 I/O 调用时,您将责任委托给驱动程序,以确保其及时完成。如果驱动程序有错误或硬件功能不正常,你可以做任何合理的事情,当这种低级操作失败时,任何程序都无法继续以有用的方式运行。

请注意,您已将指针传递给驱动程序应该填充的缓冲区,在超时到期后继续运行会留下一个悬空指针,驱动程序可能使用该指针来喷射字节当它确实设法完成请求时进入您的流程。您至少必须调用 CancelIo() 来解决这个问题。如果返回 false,则终止进程。

这一切都没有什么意义,您需要操作系统提供最低限度的服务保证。您也可以在没有 OVERLAPPED 的情况下调用 WriteFile()。现在,同样的错误驱动程序将挂起您的程序。就像 CancelIo() 挂起一样。没关系,有问题的是司机,而不是你。并不是说用户不会注意到机器有严重问题,其他程序也会遭受这种不幸。

不要编写处理极不可能的极端情况的代码。最重要的是,不要编写无法有效测试的代码。

【讨论】:

哦等等..这是重叠的IO? :(( OP 在等待什么句柄??【参考方案2】:

这不应该发生,但它显然会发生在一些“不是最佳”的驱动程序中。网络操作可能需要很长时间才能返回,因此我建议您应用较长的超时时间,可能是 2 分钟(1000*60*2),如果超时,请关闭/重新打开并重试 writeFile()。

【讨论】:

以上是关于是否可以调用 WriteFile 并且应用程序将永远等待回调?的主要内容,如果未能解决你的问题,请参考以下文章

WriteFile String Byte Length 导致崩溃

如果我在另一个 js 文件中使用 writeFile(),是不是需要再次调用 readFileSync()?

使用 io 完成端口时,WriteFile 是不是会在完成时立即发布完成数据包

Win32 WriteFile 因防病毒不返回

在 Node v12.13.0 中未调用 fsPromises.writeFile 回调

fwrite 比 Windows 中的 WriteFile 快吗?