c++ - 是否有可能调用 WriteFile 并且应用程序将永远等待回调?

标签 c++ winapi visual-c++

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

WaitForSingleObject( handle, INFINITE )

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

是否有可能出现某种情况,让我永远等待......而WriteFile无法完成他的写作?我将写入 512 kB,并且假设我的硬件没有问题。

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

最佳答案

当您进行重叠的 I/O 调用时,您将责任委托(delegate)给驱动程序以确保它及时完成。如果驱动程序有错误或硬件出现故障,您将无能为力,当此类低级操作失败时,任何程序都无法继续以有用的方式运行。

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

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

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

关于c++ - 是否有可能调用 WriteFile 并且应用程序将永远等待回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10279372/

相关文章:

c++ - 'TypeInfo<char>(char * )' isn' t defined but worked pre-C++11; what changed, and how can I fix the error?

C++14 lambda 的默认参数类型推导取决于前面的参数

c++ - 如何更改默认语言环境的千位分隔符?

visual-studio - 错误: Cannot open source file ""

c++ - 模板表达式和 visual studio 2005 c++

c++ - 用于将任意宏扩展一定次数的宏?

c++ - 关于多重继承和歧义

windows - 使用 Delphi 在 Windows 7 中检测用户何时锁定/解锁屏幕

winapi - 我可以使用 svchost.exe 来托管我自己的服务吗?

ruby - Watir 是否在 ruby​​ 1.9.1 下工作?